我是处理 git 的新手,但我有一个存储库,其中包含一个名为“test”的文件。我想检查该特定文件是否已更改。有办法做到这一点吗?
从大局来看,我正在编写一个批处理文件,如果有任何更改(我已经使用试运行选项弄清楚了),则该批处理文件将执行存储库的 git 克隆,测试文件除外(这意味着即使测试文件已更改,我不想执行 git 克隆)
如果您需要任何说明,请告诉我,感谢您抽出时间
您可以将文件或目录名称传递给
git diff
以仅查看对该文件或目录的更改。
如果您正在“编写批处理文件”,那么将
--exit-code
切换到 git diff
可能特别有用。例如。
git diff --exit-code test
或:
git diff --exit-code path/to/source/dir
如果名为
test
的文件(或任何其他指定的文件或目录)发生更改,则返回 1,否则返回 0。 (允许脚本根据结果进行分支。)
要仅查看已更改文件的名称(而不是完整的差异),请使用
--name-only
x,或者您可以使用 -s
根本不获取任何输出,而仅获取退出代码。
使用
git diff test
将显示工作目录
test
和存储库版本之间的差异。 使用 diff
将显示实际差异;如果您对这些用途不感兴趣
git diff --name-only test
正如 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 文档)。 参考
clone
(如果您之前克隆过一次,
fetch
会更便宜)。也就是说,有一些方法可以绕过这个限制:
到目前为止的 git diff 答案仅指示文件是否已更改,但不指示文件是否已暂存。例如:
git status -s test
MM test
-- or --
git status -s test
M test
-- or --
git status -s test
M test