簡體   English   中英

如何從git status中刪除未修改的二進制文件?

[英]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

命令要求: bashmd5sumgit

該程序帶有兩個或多個參數。

第一個參數是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM