检查git存储库中的特定文件是否已更改

时间:2013-07-22 21:27:42

标签: git batch-file automation

我是处理git的新手,但我有一个包含名为'test'的文件的存储库。我想检查特定文件是否已更改。反正有吗?

从大局来看,我正在编写一个批处理文件,如果发生了任何变化(我已经使用干运行选项找出),它将执行存储库的git克隆。除了测试文件外(意味着即使测试文件已经改变,我不想执行git clone)

如果您需要任何澄清并感谢您的时间,请告诉我

4 个答案:

答案 0 :(得分:12)

使用

git diff test

将显示工作目录test与存储库版本之间的差异。使用diff将显示实际差异;如果您对这些使用不感兴趣

git diff --name-only test

答案 1 :(得分:12)

您可以将文件或目录名称传递给git diff,以仅查看对该文件或目录的更改。

如果您正在编写批处理文件"然后--exit-code切换到git diff可能特别有用。例如

git diff --exit-code test

或:

git diff --exit-code path/to/source/dir

如果对名为test(或任何其他指定文件或目录)的文件进行更改,则返回1,否则返回0。 (允许脚本分支结果。)

要仅查看已更改文件的名称(而不是完整差异),请使用--name-only xor,您可以使用-s来完全没有输出,只需退出代码。

答案 2 :(得分:1)

Git不提供查询远程存储库历史记录的方法。 Git命令旨在针对本地存储库运行,因此如果您之前克隆过一次,则必须先clone fetch会更便宜。也就是说,有一些方法可以解决这个限制:

  • 你可以要求你的Git服务器通过某种API运行你想要的命令。例如,浏览GitHub网页或使用their developer API属于此类别。在这种情况下,GitHub的Web服务器正在为您运行Git命令。如果您使用的服务器不是裸Git,请检查您的服务器是否有可能有用的API。
  • 使用git-archive下载包含存储库部分的存档。我不认为这会对你有所帮助。

答案 3 :(得分:1)

answer of Peter Lundgren中已正确提及,

  

git命令旨在针对本地存储库运行,

因此无论如何都可能会调用git clone

另一方面,如果需要检查是否要触发某些特定的CI步骤,则可能会在脚本中找到类似以下有用的内容:

if git diff --quiet $COMMIT_HASH^! -- . ':!test'; then
   echo "No significant changes"
else 
   echo "There are some significant changes, let's trigger something..."
fi

--quiet禁用程序的所有输出,并暗示--exit-code(请参见git documentation)。

参考this answer,以获取有关表达式末尾模式的更多详细信息。