git post-update脚本不起作用

时间:2012-02-10 14:02:00

标签: git bash

在我的old question编辑几次之后,我创建了一个新的,因为它现在是一个新问题。

.git/hooks/post-update我有:

echo "a" >> /home/pi/log
git update-server-info
git stash
git merge testing >> /home/pi/log

进行自动结帐。所以我在客户端上运行:

git push testing HEAD:testing

现在我的/home/pi/log包含:

a
Updating ae2f44b..04753a9
Fast-forward
 application/views/main/index.php |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

但文件没有改变!

$ git merge testing
Already up-to-date.

如果我删除了该脚本,请执行推送并运行git stashgit merge testing它可以正常运行。

更新

对于测试,我将文件中的数字从17更改为20.如果我运行,我可以看到正确的文件版本

git show application/views/main/index.php

但是

vim application/views/main/index.php

仍包含旧号码。但是git声称该文件已更新:

$ git merge testing
Already up-to-date.

3 个答案:

答案 0 :(得分:5)

修改

看起来像this is your problem

 pre-receive
 update
 post-receive
 post-update
     

这些挂钩可以在裸存储库或非裸存储库中运行。同时   例如,当前工作目录将是git目录。所以,如果这样的话   是一个名为“/src/git/test.git/”的裸存储库,它将是当前的存储库   工作目录 - 如果这是一个非裸的存储库和顶级的   工作树是“/ home / mark / test /”然后是当前工作目录   将是“/home/mark/test/.git /".

     

在这两种情况下,都会设置以下环境变量:   GIT_DIR设置为“。”

     

使用工作树,这是意外的尴尬,如Chris所述   约翰森的答案我之前联系过。如果仅设置了GIT_DIR   来自git手册页的这条评论适用:

     

注意:如果指定了--git-dirGIT_DIR但未指定--work-tree,   指定了GIT_WORK_TREEcore.worktree,当前有效   目录被视为工作树的顶级目录。

     

换句话说,您的工作树也将是当前目录(   “.git”目录),几乎肯定不是你想要的。

你可以尝试在钩子里设置GIT_WORK_TREE=..GIT_WORK_TREE="$GIT_DIR/.."


  

但文件没有改变!

最有可能的确如此。也许只有线性做了,或者在查看差异时忽略了空白变化,但确实发生了变化。 Git知道,因为文件内容的SHA1总和发生了变化。

你在两端都使用Windows吗?

Windows倾向于混淆行结尾。请参阅core.autocrlf和相关选项:

答案 1 :(得分:2)

解决方案是使用正如Alex所指出的post-receive。您还需要在脚本顶部运行unset GIT_DIR

在服务器上,我创建了第二个分支并切换到它:

$ git branch
  master
* testing

我的.git/hooks/post-receive现在看起来像这样:

unset GIT_DIR
cd ..
git merge master

在客户端上,我运行git push

答案 2 :(得分:1)

您是否尝试使用post-receive挂钩?可能还没有完成post-update中的某些事情,这就是合并无效的原因。

另外我认为您应该尝试在脚本中包含git reset --hard,以便git状态与文件系统同步。