2

我正在创建一个 rake 任务,当它在 HEAD 和 HEAD^1 之间发生更改时,它将在 S3 中重新上传文件。我应该使用哪个 git 命令来执行此操作。hash-object比较这两者有意义吗?

4

2 回答 2

3

您可以使用

git log --stat HEAD^..HEAD

获取已更改文件的列表。还有其他类似的修饰符--raw将确保显示完整路径。您还可以使用--stat=200来指示 log 假设输出为 200 个字符宽,然后仅截断路径。

要考虑的一件事是,有时您不会只有一个新的提交。您将不得不使用HEAD@{1}而不是HEAD^查看最后一次提交是什么。然后你需要使用

git diff --stat HEAD@{1}..HEAD

HEAD@{1}被解释为“HEAD 上次指向的位置”。所以HEAD@{2}意思是“在你改变它两次之前 HEAD 在哪里”。如果您查看文档,reflog那里会进一步解释。

对于脚本,我会使用--numstat而不是,--stat因为它根本不缩写路径。您现在可以使用此列表仅移动那些文件或删除任何标记为已删除的文件。

您还可以比较每次提交的树对象,然后您可以递归地查看 SHA1 的不同之处。

补充一点,如果你在更新钩子中编写脚本,钩子的参数会给你oldrefnewref分支名称,这样你就知道分支当前是什么以及它被设置为什么。

但这不是理想的。如果可以,请尝试覆盖整个工作树,以免自己头疼。

于 2012-10-31T17:09:10.497 回答
3

如果要检查提交是否更改了单个已知文件,可以使用

git diff --quiet HEAD^ HEAD -- <filename>

然后检查退出代码以确定它是否已更改,如果是,退出代码将为 1,如果未更改,则退出代码将为 0。使用此方法,您无需解析输出以查看它是否提及文件你关心的。

在这种情况下,亚当建议使用HEAD@{1}而不是HEAD^仍然值得考虑。

于 2012-10-31T17:25:02.150 回答