【问题标题】:What's an easy way to detect modified files in a Git workspace?在 Git 工作区中检测修改文件的简单方法是什么?
【发布时间】:2011-04-22 10:08:02
【问题描述】:

在制作过程中,我创建了嵌入到链接输出中的字符串字段。很有用。

除了对git status命令进行复杂的sed/grep解析,如何轻松判断工作空间中的文件是否根据git修改过?

【问题讨论】:

标签: git build-process makefile


【解决方案1】:

如果您只想要一个简单的“与 HEAD 有什么不同吗?”:

git diff-index --quiet HEAD

如果退出代码为 0,则没有差异。

如果您想要“HEAD 更改了哪些文件?”:

git diff-index --name-only HEAD

如果您想要“哪些文件从 HEAD 发生了变化,它们以哪些方式发生了变化(添加、删除、更改)?”:

git diff-index --name-status HEAD

如果要重命名(和复制)检测,请添加 -M(和 -C)。

这些命令将检查暂存的内容(索引中的内容)和工作树中的文件。 git ls-files -m 之类的替代方案只会根据索引检查工作树(即,它们将忽略也在工作树中的任何暂存(但未提交)的内容)。

【讨论】:

  • @Jamie 这个答案应该会被选为正确答案。
  • 肯定有一个边缘情况,它目前不能正常工作;知道如何解决吗?如果您只是touch 一个文件,那么立即运行git diff-index HEAD,它会检测到触摸的文件已更改!似乎有某种缓存可以像git status 这样的命令首先更新,但git diff-index 不会。 git-diff-index 手册页说:“全零 sha1 意味着要获得真正的差异,您需要直接查看工作目录中的对象,而不是进行对象到对象的差异。”有没有可以做到这一点的命令?
  • @andrewdotn 在 diff-index 之前尝试git update-index -q --refresh。它应该更新导致误报的缓存 ctime/mtime。
【解决方案2】:

来自git help -a

git ls-files -m

【讨论】:

  • @Jamie:带有暂存(但未提交)更改的文件不会显示为git ls-files -m,这可能是您想要的,也可能不是。
  • 啊。感谢您的输入。说实话,git ls-files -m 不是我想要的,但它确实回答了我的具体问题。 +1 评论和回答。
  • 不幸的是,现代版本的 Git [2.10.1 (Apple Git-78)] 这似乎不起作用。
  • @Mark 我有git version 2.11.0,它在这里工作。
【解决方案3】:

git status --porcelain 似乎提供了很好的可解析输出。

【讨论】:

  • 非常好。由于其他原因会很有用。
  • 太好了,我只是用它来自动化 git 提交摘要(就像你从 GitHub 的 Web 界面获得的那样),我实际上是在寻找这个问题:one-liner to add, commit and push
【解决方案4】:

对于 git hooks,我发现这个命令很有用

git diff-index --exit-code --ignore-submodules HEAD

例如

//run some static analysis check that can change the code
something_changed=`git diff-index --exit-code --ignore-submodules HEAD`
if [ -n "$something_changed" ]
then
    echo >&2 "Something changed in $local_ref, not pushing"
    exit 1
fi

【讨论】:

  • 我喜欢这个,因为如果有变化,它会使命令失败。我在一个不应在 CI 中更改的文件上使用它。
【解决方案5】:

git diff --name-only 也一样(可能更直观...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2012-12-09
    • 2011-05-12
    • 2015-11-19
    • 2012-12-31
    • 2014-01-04
    相关资源
    最近更新 更多