2011-03-30 159 views
12

我正在编写一个定制的git命令,它只能在没有提交的全新存储库中运行(请参见this question)。我如何在脚本中执行简单的检查来查看现有的回购是否有零提交?如何检查一个git仓库是否有任何提交?

本质上,下面的空白是什么?

if ___________ ; then 
    echo "Git repo already has commits. Aborting. 
else 
    echo "Git repo has no commits. Doing whatever my script does." 
fi 
+2

git log会有什么用处? – 2011-03-30 20:21:18

回答

21

总结:

  • 一个提交已签出:测试git rev-parse HEAD &> /dev/null
  • 指向提交一个REF存在:测试git rev-list -n 1 --all &> /dev/null
  • 对象在回购存在:的git fsck测试输出,git count-objects,或检查内容.git/objects

现在讨论!

如果您想知道提交是否已签出,您可以使用git rev-parse HEAD。将会有输出,所以你可能想重定向到/dev/null,并使用退出代码。出于所有实际目的,这将足够好 - 做正常的事情,几乎不可能在没有任何指示的情况下结束。但是可以,例如删除.git目录中的文件。根据你的脚本,这可能很重要 - 如果你要吹掉.git目录,你确实想成为偏执狂。

如果你想查看是否有任何提交的文件,你可以使用git rev-list -n 1 --all。同样,会有输出(遇到第一次提交的SHA1),因此重定向到/dev/null并检查退出代码。最后,如果你想检查是否有任何提交 - 即使他们没有任何参考(你必须尝试真的很难进入这个状态),我可能只是检查存在与git fsckgit count-objects - 或如果没有,请列出.git/objects并检查除infopack之外的任何对象(如果没有文件.git/HEAD,命令往往会失败)。是的,你实际上可以有一个回报与斑点和树木,但没有承诺,但你不得不努力到达那里。如果你的脚本是可怕的,这些是绝对最安全的方法。

+3

那么,关于它覆盖它。 – 2011-03-30 21:17:02

+0

由于我们目前正在处理这个问题,我想我可能会注意到''git rev-parse HEAD''对于没有“master”分支的情况很敏感。 ''git init --bare''至少在我的最后创建一个仓库,HEAD指向master;但有人可能会前来推送某些其他分支名称的提交,并且脚本不会检测到它们(除非挂钩更新HEAD或其他东西)。这似乎是一个值得在答案中提到的典型案例。 – OEP 2013-12-21 15:55:11

+0

请注意,'git fsck'不是只读或可能需要很长时间,并且如果只有一个包,'git count-objects'将报告为零。您可以尝试使用'git count-objects -v'来查看包中有多少个对象。 – robbat2 2015-11-04 18:26:51

3

你想如果你正在使用cygwin的使用git log

或在Linux机器上gitk是一个有用的程序来也一样。

+0

如果没有提交,git log会返回一个错误。你是说我应该解释一个非零的回报值作为回购没有提交的指示吗? – 2011-03-30 20:41:46

+2

正确,git log会给你一个错误,说没有'HEAD'这意味着什么都不存在。另外,如果你使用'git branch -l',你也不会得到任何结果(也没有错误)。如果提交存在,则分支也将存在(不存在其他分支)。 – RDL 2011-03-30 20:47:29

+1

虽然这在正常使用情况下是正确的,但如果您愿意,或者如果您制造了一些特别不幸的shell错误,那么您肯定可以设法吹走所有分支(并且仍然有提交)。 – Cascabel 2011-03-31 01:11:03

相关问题