我有一个git项目,其特点是=(需要存储库同步)一些自动生成的二进制文件。
有时这些文件会由我的IDE构建过程更新,但文件不会被修改。 git命令错误地将这些文件报告为已修改。我希望这些文件在git status
或其他git
查询中未被实际修改时保持显示。
How can I remove unmodifed binary files from git status?
答案 0 :(得分:0)
使用git-checkout-unmodified-binaries。
命令要求:bash
,md5sum
,git
该程序需要两个或多个参数。
第一个参数是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)你的里程可能会有所不同,但是如果你理解构建工具是如何工作的,那么这个工具是一个很好的解决方案。