提交前脚本创建了mysqldump文件,但是出现“nothing to commit (working directory clean)”?

3
我将使用脚本.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目录以完全模拟运行脚本),每次都会有一个新的提交。如果我将其放入hooks或repo根目录中的可执行文件,并从命令行执行它,然后运行提交命令,它每次都能正常工作。只有每隔一次,而且只有在从pre-commit内部运行时才不能正常工作。
是什么原因导致了这种奇怪的行为?

我相当确定它是在之后生成的 - 我在脚本中有回声和其他 git 状态,用于测试目的,并且所有这些都发生在内置状态消息之前。此外,在不起作用的尝试中,提交数量没有增加。 - Duncan Marshall
2个回答

2

在 Git 钩子里,请务必指定 git_dir 和 work_tree:

git --git-dir=/path/to/your/repo/.git --work-tree=/path/to/your/repo add -- yourFile

通过在钩子中更改文件夹,您并没有更改当前的git仓库。如果该仓库应该更改,则最好使用--git-dir选项明确引用它。


1
@DuncanMarshall 不是在最上面,而是在 git add 行中。 - VonC
1
@DuncanMarshall 这可能是一些同步问题(git尚未识别修改的文件)。您能否在git add之前添加0.5秒的延迟?(sleep 0.5, http://serverfault.com/a/469259/783) - VonC
1
@DuncanMarshall,那个钩子会输出什么git status?(特别是在50%的时间里,git add不起作用的情况下) - VonC
1
@DuncanMarshall,所以git add在正确顺序下永远不会成功,因为git add之前的git status已经显示了“要提交的更改”。您可以尝试在第二个git status之前增加一个sleep 0.5 - VonC
1
@DuncanMarshall 我明白,但是使用更新版本的git通常是个好主意 ;) - VonC
显示剩余19条评论

1
我观察到的是,“pre-commit”挂钩发生在git“冻结”要受影响的文件列表之后(即,选择了存储库状态的内容可寻址名称),它不能被影响以更改它; 相反,“pre-commit”中的“git add”正在更改索引,一旦提交完成,它将生效,因此“下一个”“git commit”显示了“pre-commit” git挂钩中“git add”的结果。
这里有一个更全面的讨论:在pre-commit git hook中是否可以重新设置文件? 在我的尝试中,在自己的“pre-commit”挂钩中执行“git add”(我同样想自动生成并“git add”一些文件到我的提交)时,我尝试了各种技巧,但最终变得非常丑陋,并且git会给出无用的投诉。 我将放弃我的挂钩/ pre-commit 尝试,而是使用一个shell别名来执行“stuff && git add things && git commit”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接