如何从git status中删除未修改的二进制文件?

时间:2017-12-12 00:35:58

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

我有一个git项目,其特点是=(需要存储库同步)一些自动生成的二进制文件。

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

How can I remove unmodifed binary files from git status?

1 个答案:

答案 0 :(得分:0)

使用git-checkout-unmodified-binaries

命令要求:bashmd5sumgit

该程序需要两个或多个参数。

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

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

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

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

注意:第一次运行程序时,除了缓存指定文件的当前MD5总和之外,它不会做任何事情。此后,它将使用该MD5文件来比较当前文件集。比较完成后,将生成新的MD5求和文件。

你必须向这个孩子打电话,进入你的构建过程。通常,在您完成所有内容之后,在提交更改之前。如果您有自定义提交命令,则可能在执行该命令之前运行此工具。

您可能会想:为什么git不会自动执行此操作?你和我在想同样的事情。可能在某个地方有一个选项,但是我的build / 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)您的构建工具不会覆盖/更新二进制文件,AND

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

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

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

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

- 使用更新 -

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