在我的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 stash
,git 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.
答案 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-dir
或GIT_DIR
但未指定--work-tree,
指定了GIT_WORK_TREE
和core.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状态与文件系统同步。