
[英]How can I remove binary files derived from source code in Git and yet still deploy to a remote repository?
[英]How can I remove unmodifed binary files from git status?
我有一个git项目,功能=(需要存储库同步)一些自动生成的二进制文件。
有时,这些文件由我的IDE构建过程更新,但未修改。 git命令错误地将这些文件报告为已修改。 我想防止这些文件在未经过实际修改的git status
出现在git status
或其他git
查询中。
How can I remove unmodifed binary files from git status?
使用git-checkout-unmodified-binaries 。
命令要求: bash
, md5sum
, git
该程序带有两个或多个参数。
第一个参数是git项目根目录的路径,所有其他参数都是相对于您要选择进行修改测试的git根目录的文件。
(1)该命令将使用md5sum
程序来计算该文件是否实际上是根据先前存储的md5记录进行修改的,
(2)然后它将要求git
提供所有已修改文件的列表,并将针对该列表检查该列表。
(3)如果git
错误地报告二进制文件修改,程序将使用git
从当前分支中检出该文件。
注意:第一次运行该程序时,除了缓存您指定文件的当前MD5总和之外,它什么也不会做。 此后每次,它将使用该MD5文件比较当前文件集。 比较完成后,将生成一个新的MD5和文件。
您将不得不将此主管的执行电话放到某个地方的构建过程中。 通常,在完成所有内容构建之后以及提交更改之前。 如果您具有自定义的commit命令,则可能在执行该命令之前就正在运行该工具。
您可能会想:为什么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)您的构建工具不会覆盖/更新二进制文件,并且
(2)您没有在构建后提交更改(例如,在实时应用程序测试周期内)。
这是因为git checkout ...
操作可能会触及分发存储库中的文件; 清理您的工作树。
通常,在运行命令后touch
所有生成的源是安全的(unix表示将文件的写入时间戳更新为当前时间),但这可能不是很有效,具体取决于您将拥有的文件数进行处理,以及它们各自的大小以及您的操作系统和硬件。 由于md5和的计算,最明显的延迟将是文件大小。
总结本文档/更新; 您需要在运行此命令后更新生成的源的写入时间戳记,以便下次运行该命令时,已在git
commit之间重新生成但未保存在git
commit中的任何文件都将通过此命令运行再次过滤过程; 这样,您就可以在提交更改之前在实时(本地二进制分发git root)存储库上执行更多的构建/测试和编辑。
-使用更新-
您可以在构建之前从分发根目录中删除自动生成的文件副本,而不用弄乱文件时间戳。 缺少文件条件将迫使大多数构建工具复制/重新生成。 我将几个缓存文件夹(lib,docs等)用于生成的文件,并且有一个分发步骤,该步骤仅将文件复制到分发git项目根目录下。 这种方法是我可以与构建工具保持一致的唯一方法。 (IntelliJ-IDEA),您的工作量可能会有所不同,但是如果您了解构建工具的工作原理,那么此工具是一个很好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.