2010-01-29 57 views
5

我正在使用git來管理我擁有的grails項目。我在遠程服務器上建立了一個git倉庫,我想要做的是當我有本地代碼工作時,我想提交它並推送到遠程服務器。我希望更新後的groovy文件和gsp被放到遠程服務器上的正確位置,以便grails能夠接受遠程測試的更改。這可能嗎?如何使用git檢入文件?

+0

您使用的是linux,mac或windows嗎? – Alos 2010-01-29 18:09:41

+0

遠程服務器是Linux,本地我有一臺Windows機器(使用龜git),我也有一個mac。所以我通過遙控器在這些機器之間同步代碼,但是我希望遙控器具有活動構建的Grails應用程序,該應用程序會在推送時進行更新。 – TripWired 2010-01-29 18:19:50

+0

剛剛添加了一些建議作爲我的回答你的'更新後'執行的意見。首先查看該評論的最後一個鏈接。 – VonC 2010-01-29 21:52:34

回答

6

如果你推送到一個遠程回購,其中「它似乎只包含一個大包裝文件,沒有實際的源代碼「(如你在註釋中詳細說明的那樣),這應該意味着」bare repo「,這對它有好處,它可以讓你在工作樹和git數據之間沒有任何差異的風險。

然後,如「Can I use git to keep a remote server up to date?」中所述,裸露回購方面的另一個(非裸回購)和post-update hook會將您帶到您想要的地方。


的OP TripWired補充說:

好了,所以我所做的是:

  • 創建裸回購在隨後
  • 檢查我創造了另一個回購,這是標準,基本上我有~/project.git~/project
  • 我克隆project.gitprojectproject.git/hooks/post-update我把:

    CD ../../project ENV -i git的結帳。 ENV -i混帳拉

我也確信,更新後爲可執行文件。
當我從命令行運行鉤子時,它工作正常,但它似乎沒有工作時,我做了檢查回購。

我同意步驟1和2,但會使用this script,如this question

檢查它是否與git push一起從您當地的回購協議到裸回購協議。

#!/bin/sh 
# 
# This hook does two things: 
# 
# 1. update the "info" files that allow the list of references to be 
#  queries over dumb transports such as http 
# 
# 2. if this repository looks like it is a non-bare repository, and 
#  the checked-out branch is pushed to, then update the working copy. 
#  This makes "push" function somewhat similarly to darcs and bzr. 
# 
# To enable this hook, make this file executable by "chmod +x post-update". 

git-update-server-info 

is_bare=$(git-config --get --bool core.bare) 

if [ -z "$is_bare" ] 
then 
    # for compatibility's sake, guess 
    git_dir_full=$(cd $GIT_DIR; pwd) 
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac 
fi 

update_wc() { 
    ref=$1 
    echo "Push to checked out branch $ref" >&2 
    if [ ! -f $GIT_DIR/logs/HEAD ] 
    then 
     echo "E:push to non-bare repository requires a HEAD reflog" >&2 
     exit 1 
    fi 
    if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null) 
    then 
     wc_dirty=0 
    else 
     echo "W:unstaged changes found in working copy" >&2 
     wc_dirty=1 
     desc="working copy" 
    fi 
    if git diff-index --cached [email protected]{1} >/dev/null 
    then 
     index_dirty=0 
    else 
     echo "W:uncommitted, staged changes found" >&2 
     index_dirty=1 
     if [ -n "$desc" ] 
     then 
      desc="$desc and index" 
     else 
      desc="index" 
     fi 
    fi 
    if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ] 
    then 
     new=$(git rev-parse HEAD) 
     echo "W:stashing dirty $desc - see git-stash(1)" >&2 
     (trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT 
     git-update-ref --no-deref HEAD [email protected]{1} 
     cd $GIT_WORK_TREE 
     git stash save "dirty $desc before update to $new"; 
     git-symbolic-ref HEAD "$ref" 
     ) 
    fi 

    # eye candy - show the WC updates :) 
    echo "Updating working copy" >&2 
    (cd $GIT_WORK_TREE 
    git-diff-index -R --name-status HEAD >&2 
    git-reset --hard HEAD) 
} 

if [ "$is_bare" = "false" ] 
then 
    active_branch=`git-symbolic-ref HEAD` 
    export GIT_DIR=$(cd $GIT_DIR; pwd) 
    GIT_WORK_TREE=${GIT_WORK_TREE-..} 
    for ref 
    do 
     if [ "$ref" = "$active_branch" ] 
     then 
      update_wc $ref 
     fi 
    done 
fi 
+0

這聽起來像它可能工作。因此,如果我擁有裸存儲庫並更新我的更新後掛鉤,我可以使用它將源代碼複製到另一個目錄中?我假設我需要一個類似於我的本地機器上的git repo,它只是從裸回購中做一個克隆? – TripWired 2010-01-29 18:57:45

+0

是第一次,是(在最簡單的情況下)第二次。如果回購規模巨大是一個問題,我可以想到更復雜的方法來避免重複,但我懷疑你是否屬於這種情況。 – Cascabel 2010-01-29 19:12:14

+0

好吧,所以我做的是創建裸露的回購檢查然後我創建了另一個標準回購,基本上我有〜/ project.git和〜/項目。我克隆project.git到項目和project.git /鉤子/後更新我把:(cd ../../project)(env -i git結帳。)(env -i git pull)parens只是爲了分開在這裏的線。我也確保更新後的版本是可執行的。當我從命令行運行鉤子時它工作正常,但它似乎並沒有工作,當我做檢查到回購。有任何想法嗎? – TripWired 2010-01-29 21:22:57

0

如果你在linux上,你可以設置一個cron作業來爲你複製文件,或者如果你在windows上,你可以使用小的bat或vbs腳本創建一個計劃任務,以將文件複製到遠程服務器。如果您在使用Git時需要幫助,請參閱用戶手冊。如果這不是你尋找的東西,我們可以開展一些更好的工作,或者如果你需要幫助,請告訴我。

+0

那麼git是否不在遠程服務器上存儲實際文件?我在本地創建了一個存儲庫,提交所有文件然後推送到遠程服務器,它似乎只包含一個大的包文件,沒有實際的源代碼。服務器是linux(紅帽子)。謝謝(你的)信息。 – TripWired 2010-01-29 18:18:15

+0

我只是不確定你要求的是什麼。 Git的一個優點是你不需要集中的方法,但是如果你願意,你可以。 – Alos 2010-01-29 18:47:48

5

關於您對Alos的帖子的評論:遠程是所謂的裸倉庫 - 它包含除簽出的內容副本之外的整個倉庫。這個想法是,對於您只需推送和從中拉出的中央存儲庫,就不需要擁有這些文件。

也就是說,有很多方法可以做你想做的事情。

  • 您可以創建另一個遠程非光禿克隆,並使用它從光禿禿的克隆中拉出並進行測試。這可能是最簡單的。

  • 你可以直接檢查出從裸露的回購協議文件(使用git read-treegit checkout-index)(一個例子想到,git.git的install-doc-quick.sh)。

  • 您甚至可以使用非裸露的遠程控制器,但請記住,因爲工作樹不會更新,因此推入非裸露的回購區是非常危險的。根據你的git版本,有各種不同的安全措施需要覆蓋,你可以在推送後修復工作樹(可能是git reset --hard)。

無論哪種方法你拿,假設你想每推後觸發你的測試,你可以使用post-receive or post-update hook這樣做。 (如果你想避免突發性的重複測試,你可以檢查自上次測試以來的時間長度)

+0

沒有冒犯。乾杯 – Alos 2010-01-29 18:48:22

+0

當我發佈我的時候完全錯過了你的答案。列舉所有可能性+1。 – VonC 2010-01-29 20:12:32

+0

你已經有了我的+1鏈接到上一個問題。 – Cascabel 2010-01-29 20:32:14