我正在创建一个rake任务,当它在HEAD和HEAD ^ 1之间发生变化时会重新上传S3中的文件。我应该使用哪个git命令来执行此操作。比较这两个中的hash-object
是否有意义?
答案 0 :(得分:3)
你可以使用
git log --stat HEAD^..HEAD
获取已更改文件的列表。还有其他修饰符,如--raw
,可确保显示完整路径。您还可以使用--stat=200
指示日志假设输出宽度为200个字符,然后仅截断路径。
要考虑的一件事是,有时你不会只有一个新的提交。您必须使用HEAD@{1}
而不是HEAD^
来查看上次提交的内容。然后你需要使用
git diff --stat HEAD@{1}..HEAD
HEAD@{1}
被解释为“上次HEAD指向的位置”。所以HEAD@{2}
意味着“在你改变它之前HEAD是在哪里”。如果您查看reflog
的文档,可以在那里进一步解释。
对于脚本编写,我会使用--numstat
而不是--stat
,因为它根本不会缩写路径。您现在可以使用此列表仅移动这些文件或删除任何标记为已删除的文件。
你也可以比较每个提交的树对象,你可以递归地看到SHA1的不同之处。
要添加,如果您在更新挂钩中编写脚本,则挂钩的参数会为您提供oldref
和newref
以及分支名称,以便您准确知道当前分支的内容以及它被设定为。
但这不是理想的。如果可以,请尝试覆盖整个工作树并避免头痛。
答案 1 :(得分:3)
如果要检查提交是否更改了单个已知文件,可以使用
git diff --quiet HEAD^ HEAD -- <filename>
然后检查退出代码以确定它是否已更改,如果是退出代码将为1如果不更改退出代码将为0.使用此方法您将不需要解析输出以查看如果它提到你关心的文件。
在这种情况下,亚当建议使用HEAD@{1}
而不是HEAD^
仍然值得考虑。