【问题标题】:Check if specific file in git repository has changed检查 git 存储库中的特定文件是否已更改
【发布时间】:2013-07-21 18:54:42
【问题描述】:

我是处理 git 的新手,但我有一个存储库,其中包含一个名为“test”的文件。我想检查该特定文件是否已更改。有什么办法吗?

从总体上看,我正在编写一个批处理文件,如果有任何变化(我已经使用空运行选项发现),我正在编写一个批处理文件,它将执行存储库的 git 克隆,但测试文件除外(这意味着即使测试文件已更改,我不想执行 git clone)

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

【问题讨论】:

    标签: git batch-file automation


    【解决方案1】:

    您可以将文件或目录名称传递给 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 根本不获取任何输出,而只是获取退出代码。

    【讨论】:

    • 退出代码正是我需要的 bash 脚本!谢谢
    • 很好的答案,但由于某种原因,单独--exit-code 不会影响在区分标记为有冲突的文件时的退出代码,即使文件包含在git diff 期间出现的差异。不过,git diff -s --exit-code $CONFLICTED_FILE 有效。见于 git 2.27.0。
    【解决方案2】:

    使用

    git diff test
    

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

    git diff --name-only test
    

    【讨论】:

    • 谢谢,您介意解释一下您的建议与: git fetch -v --dry-run 之间的区别
    • fetch 将报告远程和本地存储库之间的文件级差异。 diff 将在本地存储库和工作目录中的文件之间产生行级差异。
    • diff 之后添加HEAD 还将考虑为提交而进行的更改,这可能是您想要的。
    • 对于顺序脚本,您可以使用git diff --no-pager 来防止 git 在寻呼机中显示结果
    • 我相信--no-pager 必须紧跟在git 之后,比如git --no-pager diff
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的信息。所以我实际上确实有一个存储库的本地副本。如果该特定测试文件是唯一更改的内容,我想检查本地存储库。
    【解决方案4】:

    正如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 以获取有关表达式末尾模式的更多详细信息。

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 1970-01-01
      • 2018-12-07
      • 2018-09-13
      • 1970-01-01
      • 2019-03-26
      • 2019-09-27
      • 1970-01-01
      相关资源
      最近更新 更多