2012-07-07 89 views
4

我用下面的後收到鉤:在合併後的git-receive掛鉤

GIT_TOP=`git rev-parse --show-toplevel` 

while read oldrev newrev refname 
do 
     echo "=== $oldrev" 
     echo "=== $newrev" 
     echo "=== $refname" 

     echo "=== 01. checkout -- $GIT_TOP/*" 
     git checkout -- "$GIT_TOP/*" 

     echo "=== 02. merging $refname" 
     git merge $refname 

     echo "=== 03. checkout -- $GIT_TOP/*" 
     git checkout -- "$GIT_TOP/*" 

done 

的想法是很清楚:我想當前分支與推送的一個合併。

  • 然後我執行:git status它告訴我,我的本地樹不同於分支!

  • 比我執行更多git checkout -- *在git目錄頂部 - 現在這個命令做我想要的:git status顯示現在沒有區別了。

爲什麼這個命令git checkout -- "$GIT_TOP/*"沒有在鉤子中工作,只能通過直接調用?如何在hook中運行這個命令?

P.S.

我發現git rev-parse --show-toplevel從掛鉤內調用的路徑返回<myrepo>/.git,但是從shell中它的值只是<myrepo>。可能是這可以幫助解決問題。

回答

2

export GIT_WORK_TREE=$GIT_DIR/.解決了我的問題。現在甚至不需要git checkout -- "$GIT_TOP/*"。因爲git merge $refname工作正常 - 在正確的目錄上。

+0

你介意更新包含最終版本的問題? :)或者這個答案,然後將其標記爲分辨率? – simme 2015-08-12 13:42:15

1

Thx爲此。

我嘗試這樣做:

export GIT_WORK_TREE=$GIT_DIR/. 
while read oldrev newrev refname 
do 
     echo "=== merging $refname" 
     git merge $refname 
done 

回來錯誤: 「您當地的下列文件中的更改將被合併覆蓋」 ..提的只是把文件。

這表明,它不是要合併剛剛接收到的改變到主分支

也許需要的是結賬高手?

我能夠手動進行合併。

Paul

3

好的,現在就工作吧。多思考少複製。

export GIT_WORK_TREE=`pwd` 
export GIT_DIR=`pwd`/.git 

保羅