![](/img/trans.png)
[英]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.