簡體   English   中英

Git:從歷史記錄中刪除提交而不更改任何其他內容(日期、提交者)

[英]Git: Remove commit from history without changing anything else (dates, committers)

我希望這和交互式 rebase 一樣簡單,但我注意到 rebase 會更改提交日期和提交者。

從歷史記錄中刪除提交同時保持其他所有內容不變的最簡單方法是什么?

git rebase有一個-x / --exec選項可以提供幫助。

您可以添加環境變量,對於 rebase todo列表中的每個提交,有助於保持日期/作者不變:

我在“ git rebase without changes commit timestamps ”中提到了這一點

git rebase -i --committer-date-is-author-date \
 -x 'git config user.name "$(git show -s --format=%an $(git rev-parse HEAD))"' \
 -x 'git config user.email "$(git show -s --format=%ae $(git rev-parse HEAD))"' \
 @~x

(取代x@~x的你希望你的互動變基開始的提交數量)

問題是:您需要第一個pick待辦事項之前手動復制這些生成的行,以便第一次提交使用這些設置。

我嘗試了多種使用git rebasegit filter-branch ,但都沒有奏效。 git filter-branch可能無法工作,因為它對快照進行操作,而刪除提交則需要對更改集/補丁進行操作。

唯一有效的解決方案是基於git cherry-pick創建我自己的變基:

# !!! Only do this when the working copy is clean !!!
git checkout --orphan new_branch
# Now clean up all the files
# !!! Careful !!!
# git reset --keep

git log --reverse --format=%H source_branch |
  grep -v -E "sha1|sha2|sha3" |
  while read sha; do
   (
    echo "Cherry-picking $(git show --no-patch --format=oneline "$sha")"
    export GIT_COMMITTER_NAME=$(git show -s --format=%cn "$sha")
    export GIT_COMMITTER_EMAIL=$(git show -s --format=%ce "$sha")
    export GIT_COMMITTER_DATE=$(git show -s --format=%cd "$sha")
    git cherry-pick "$sha" -Xtheirs
   )
  done

暫無
暫無

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

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