使用git-checkout-unmodified-binaries。
命令要求:bash、md5sum、git
程序接受两个或更多参数。
第一个参数是你的 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) 您的使用范围可能会有所不同,但是如果您了解构建工具的真正工作原理,此工具是一个很好的解决方案。