这是非常奇怪的,但是当设置一个Git仓库并创build一个post-receive hook:
echo "--initializing hook--" cd ~/websites/testing echo "--prepare update--" git pull echo "--update completed--"
挂钩确实运行,但它从来没有设法正确运行git pull:
6bfa32c..71c3d2a master -> master --initializing hook-- --prepare update-- fatal: Not a git repository: '.' Failed to find a valid git directory. --update completed--
所以我现在问自己,怎么可能让钩子用post-receive更新克隆呢?
在这种情况下,运行进程的用户是相同的,并且它在用户文件夹内的一切,所以我真的不明白…因为如果我手动进入
cd ~/websites/testing git pull
它工作没有任何问题…
任何帮助,将非常感激
非常感谢
当钩子运行时, GIT_DIR
和(如果工作树被明确定义) GIT_WORK_TREE
被设置。 这意味着您的拉动将不会与您更改到的目录中的第二个存储库一起运行。
试试git --git-dir ~/websites/testing/.git --work-tree ~/websites/testing pull
; 或者用下面的方法取消git的repo-local环境:
unset $(git rev-parse --local-env-vars)
更多的信息在man 1 git中的这些环境variables。
我经历的一件事是使用post-update
钩子“–git-dir”工作得很好,但git仍然抱怨缺less工作树(尽pipe使用了“–work-tree”)
总之,这不起作用:
git --git-dir /path/to/websites/testing/.git --work-tree /path/to/websites/testing pull
而这工作:
cd /path/to/websites/testing
git --git-dir /path/to/websites/testing/.git pull
这不工作吗?
cd /home/smb/websites/testing env -i git pull
编辑
更好的是
cd /home/smb/websites/testing unset GIT_DIR git pull
你有没有尝试完整的path,而不是〜?
cd /home/smb/websites/testing git pull
这个脚本可能是用/bin/sh
调用的,它不能理解~
。 试试用~
的完整path来代替。
第一个build议的答案是正确的 – 当一个钩子正在运行GIT_DIR等被设置。 但是,如果您想要在另一个存储库中使用该脚本,那么该方法有缺陷,因为它硬编码重置GIT_DIR。 正如他们所暗示的那样,另一种方法是通过使用env来移除variables,如下所示:env -i git reset –hard显然你在那里运行的命令是由你决定的 – 这只是'env -i' 。