4

我使用以下接收后挂钩:

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 dir 的顶部执行更多的命令 - 现在这个命令做我想要的:git status现在不再显示任何差异。

为什么这个命令git checkout -- "$GIT_TOP/*"在钩子中不起作用,只能通过直接调用起作用?如何在钩子中运行此命令?

附言

我发现git rev-parse --show-toplevel从钩子中调用返回<myrepo>/.git路径,但从 shell 中它的值只是<myrepo>. 可能这可以帮助解决问题。

4

3 回答 3

3

好的,现在可以使用了。多思考少抄袭。

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

保罗

于 2012-10-01T18:30:26.787 回答
2

export GIT_WORK_TREE=$GIT_DIR/.解决了我的问题。现在甚至git checkout -- "$GIT_TOP/*"不需要了。因为git merge $refname工作正常 - 在正确的目录上。

于 2012-07-07T16:20:02.463 回答
1

谢谢。

我试过这个:

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

返回错误:“您对以下文件的本地更改将被合并覆盖”..提到刚刚推送的文件。

这表明它没有尝试将刚刚收到的更改合并到主分支

也许需要那个结帐大师?

我能够手动进行合并。

保罗

于 2012-10-01T15:41:22.593 回答