簡體   English   中英

將更改應用於所有提交

[英]Apply change to all commits

我在當前的項目中犯了一個可怕的錯誤。 當我創建我的 java 項目時,我使用了錯誤的子包。

最好的情況是,我可以在第一次提交時重命名 package,並將所有后續提交更改為正確的 package 名稱。

原因是我在一篇科學論文中引用了提交和包。 現在提交重命名將是非常不幸的。

有沒有辦法應用此更改傳遞,所以我不必手動編輯所有提交? 所有提交都已推送到遠程。

我是唯一的作者,擁有所有的管理權限。 我想保留提交歷史 - 這意味着我不想壓縮所有提交。 如有必要,可以更改他們的身份。

編輯:

我對這兩種方法都應用了所需的更改,並想總結一下以供將來參考。

通過git rebase -i的變基方法對於許多提交來說非常乏味。 必須對所有文件和所有目錄的所有提交應用必要的更改。 由於我的情況下提交的數量,我無法做到沒有任何錯誤,導致一些壓縮提交。 如果沒有grepfind或我的編輯器的功能,我就不會成功。

答案https://stackoverflow.com/a/66122950/6783797建議的命令git filter-branch可靠地完成了這項工作。 要應用的更改是:

  1. 重命名目錄
  2. 查找我需要更改內容的文件

重命名目錄:

JAVADIR="$PWD/path/to/parent/package"
if [ -d "$JAVADIR/wrong" ]; then
  mv "$JAVADIR/wrong" "$JAVADIR/right"
fi

為了找到合適的文件,我從接受的答案中通過管道findsed -i 's/wrong/right/g' 將它們組裝在一起給出: git filter-branch --tree-filter "sh /path/to/rename_script.sh; find. -type f \( -iname '*.java' -o -iname '*.xml' \) | xargs -r sed -i 's/wrong/right/g'"

我最終得到的是一個分歧的分支,我想在我的遙控器上使用它。 快速搜索給了我這個答案: https://stackoverflow.com/a/40201484/6783797

正如@WilliamPursell 建議的那樣,在您的情況下filter-branch是最合適的命令。 它是git提供的一個非常高效和靈活的工具,但是要注意,如果使用不當很危險。

首先, filter-branch重寫歷史,如果需要,整個歷史,並接受幾個選項。 在您的情況下, --tree-filter因為您需要更改一個或多個文件的內容,我猜。 舊的提交不會永遠丟失,但它們仍然可以訪問,因為舊的HEAD仍然由refs/original/refs/heads/your_branch 您可以使用git log --all查看舊提交。 鑒於您獨自參與該項目肯定是一個優勢,沒有人會抱怨他們的歷史或其中的一部分已被改寫。

老實說,我不知道在filter-branch命令之后創建的備份分支是永遠保留在那里還是在某個時間后它會自動 gced。 我確信在刪除該指針之前您不能執行另一個filter-branch ,除非您強制它-f

在所有這些警告之后,您可能會運行類似於以下的內容:

git filter-branch --tree-filter "sed -i 's/import my.wrong.package/import my.right.package;/g' target_file"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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