我正在使用脚本.git / hooks / pre-commit来获取MySQL数据库的快照以及其他项目文件。以下是内容:
#!/bin/bash
mysqldump -u user -ppassword --skip-extended-insert dbname > /path/to/repo/dbname.sql
cd /mnt/hoste/Storage/Code/test-repo/
git add /path/to/repo/dbname.sql
如果我跑:
git commit -am "Message"
创建了一个新的转储文件,但是git告诉我:
nothing to commit (working directory clean)
然后,如果我再次运行相同的提交命令,它可以工作:
1 file changed, 1 insertion(+), 1 deletion(-)
然后,如果我再次运行相同的命令,则回到“没有提交”。这种模式无限制地继续 - 工作,不起作用,工作,不起作用。这不是基于时间(我已经尝试过立即提交,等待10分钟)。 Mysqldump肯定会更新.sql文件(它会在文件末尾附近用hh:mm:ss格式标记它们)。
如果我接受脚本,并在命令行中逐行运行(包括首先cd到hooks目录以完全模拟运行脚本),每次都有一个新的提交。如果我将它放在钩子或repo root中的可执行文件中,并从命令行执行它,然后运行commit命令,它每次都有效。它只是每隔一段时间都不起作用,然后才会在预先提交时运行。
什么可能导致这种奇怪的行为?
答案 0 :(得分:2)
在钩子中,确保始终指定git_dir和work_tree:
git --git-dir=/path/to/your/repo/.git --work-tree=/path/to/your/repo add -- yourFile
通过更改挂钩中的文件夹,您不更改当前git仓库的内容。如果该回购应该更改,最好使用--git-dir
选项明确引用它。
答案 1 :(得分:0)
我观察到的是,在git已经“冻结”了要受影响的文件列表(即,选择了存储库状态的内容可寻址名称)之后,发生了“预提交”钩子,并且不能影响更改那;相反,预提交钩子中的“ git add”正在对索引进行更改,一旦完成提交,索引将生效,因此 next “ git commit”显示了结果在预先提交的git钩子中添加“ git add”。
更全面的讨论在这里:Can one re-stage files in a pre-commit git hook?
在尝试在自己的预提交钩子中执行“ git add”(我同样希望自动生成某些文件并将其“ git add”到我的提交中)时,我尝试了递归调用的各种技巧git-commit,但这最终变得非常丑陋,并且git提出了无用的抱怨。我将放弃钩子/预提交的尝试,而是使用一个执行“ stuff && git add something && git commit”的shell别名。