【问题标题】:How can I remove unmodifed binary files from git status?如何从 git status 中删除未修改的二进制文件?
【发布时间】:2017-12-12 00:35:57
【问题描述】:

我有一个 git 项目,其中 features=(REQUIRES 存储库同步) 一些自动生成的二进制文件。

有时这些文件会由我的 IDE 构建过程更新,但不会修改这些文件。 git 命令错误地将这些文件报告为已修改。当这些文件实际上没有被修改时,我希望这些文件不会出现在 git status 或其他 git 查询中。

How can I remove unmodifed binary files from git status?

【问题讨论】:

  • 我猜你知道你在做什么,但是 git 新手可能不会发现这个问题:尽可能不要将二进制文件添加到 git。您可以使用 .gitignore 文件从 git 状态中隐藏它们。通常二进制文件可以通过你的 IDE 或一些 install/setup/make 脚本从源文件(这些属于 git)创建。
  • @dauer,这对新手来说是个好主意。但是,我的项目是二进制项目版本。没有办法绕过这个需求。需要明确的是:我不是要隐藏或排除二进制文件,而是使用 git 来跟踪对它们所做的修订。项目仅有的文本文件是 LICENSE、README.MD、支持脚本等。请注意,对其他人的想法负责并不特定于问题。

标签: git github automation binary-data build-tools


【解决方案1】:

使用git-checkout-unmodified-binaries

命令要求:bashmd5sumgit

程序接受两个或更多参数。

第一个参数是你的 git 项目根目录的路径,所有其他参数都是相对于你要选择进行修改测试的 git 根目录的文件。

(1) 该命令将使用md5sum 程序来计算文件是否实际上已从先前存储的 md5 记录中修改,

(2) 然后它会向git 询问所有已修改文件的列表,并根据其列表检查该列表。

(3) 如果git 错误地报告二进制文件修改,程序将使用git 从当前分支中检出该文件。

注意:第一次运行该程序时,它只会缓存您指定文件的当前 MD5 和。此后的每次,它将使用该 MD5 文件来比较当前文件集。比较完成后,会生成一个新的 MD5 sum-file。

您将不得不将 exec 调用添加到此婴儿的某个位置,并将其添加到您的构建过程中。通常,在您完成构建所有内容之后,并在您提交更改之前。如果您有自定义提交命令,您可能会在执行该命令之前运行此工具。

您可能会想:为什么 git 不自动执行此操作?你和我在想同样的事情。可能有一个选项可以解决这个问题,但是我的构建/vcs 工具不允许我配置这些东西,所以这就是我想出的。

来源清单:

#!/usr/bin/env bash

# This is a Git tool which zaps-auto-generated-binaries, which have not
# been modified from the previous version.

# This tool is designed to help keep commit history clean and concise.

GITROOT="`realpath $1`"; shift;

MD5FILES="$@";

MD5CACHE=${GITROOT}/MD5;

md5.cache() { md5sum -b $MD5FILES > $MD5CACHE; }
md5.unmodified.files() { md5sum -c $MD5CACHE | grep OK | cut -d: -f1; }

git.modified.files() { git ls-files -m; }

params.contains() {
    match="$1"; shift;
    for arg; do [[ "$match" == "$arg" ]] && echo $arg; done;
}

filter.matches() {
  while read line; do
    params.contains "$line" "$@";
  done;
}

(
 cd $GITROOT;
 [[ -e "$MD5CACHE" ]] && {
   FILES=$(git.modified.files | filter.matches $(md5.unmodified.files))
   [[ -n "$FILES" ]] && git checkout $FILES;
 }
 md5.cache;
)

-- 使用更新--

运行此命令后,您需要触摸生成的源代码:

(1) 您的构建工具不会覆盖/更新二进制文件,并且

(2) 您没有在构建后提交更改(例如在实时应用程序测试周期中)。

这是因为您的分发存储库中的文件可能会被git checkout ... 操作触及;这会清理你的工作树。

通常,在运行命令后,touch(unix 表示将文件的写入时间戳更新为文件的当前时间)所有生成的源都是安全的,但这可能不是很有效,具体取决于数量您必须处理的文件的数量,以及它们各自的大小,以及您的操作系统和硬件。由于 md5 总和计算,最显着的延迟将是文件大小。

总结此文档/更新,向上;您需要在运行此命令后更新生成的源的写入时间戳,以便下次运行该命令时,在git 提交之间重新生成但未保存在git 提交中的任何文件,将再次运行此过滤过程;这将允许您在提交更改之前在实时(本地二进制分发 git root)存储库上执行更多构建/测试和编辑。

-- 使用更新--

您可以在构建之前从分发根目录中删除自动生成的文件副本,而不是弄乱文件时间戳。丢失的文件条件将迫使大多数构建工具复制/重新生成。我为生成的文件使用了几个缓存文件夹(libs、docs 等),并且我有一个分发步骤,它只是将文件复制到分发 git 项目根目录。这种方法是我唯一可以与我的构建工具一致地工作的方法。 (IntelliJ-IDEA) 您的使用范围可能会有所不同,但是如果您了解构建工具的真正工作原理,此工具是一个很好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2011-01-02
    • 2017-12-22
    • 2014-06-12
    相关资源
    最近更新 更多