【问题标题】:Git: Remove commit from history without changing anything else (dates, committers)Git:从历史中删除提交而不更改任何其他内容(日期,提交者)
【发布时间】:2021-09-24 23:13:36
【问题描述】:

我希望这与交互式 rebase 一样简单,但我注意到 rebase 会更改提交日期和提交者。

什么是从历史记录中删除提交而其他所有内容保持不变的最简单方法?

【问题讨论】:

  • 对提交的任何更改都会导致新的不同提交。如果您对此感到满意,请查看 filter-branch 和/或 filter-repo,它们可以让您直接控制每个新提交的所有部分,因为您从那时起完全重写所有内容。您必须让拥有原始存储库克隆的每个人也放弃他们的克隆,并切换到新存储库。

标签: git git-rewrite-history


【解决方案1】:

git rebase 有一个 -x/--exec option 可以提供帮助。

您可以添加environment variables,这将有助于在 rebase todo 列表中的每个提交保持日期/作者不变:

我在“git rebase without changing 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 todo 项之前手动复制这些生成的行,以便第一次提交使用这些设置。

【讨论】:

  • 有趣。不幸的是,即使是扩展形式(我设置了所有 6 个变量),它似乎也不适用于我。一旦变基到达跳过的提交,我就会得到Committer identity unknown *** Please tell me who you are.。 exec 语法看起来很奇怪。你确定引号是正确的吗?不应该是-x 'export GIT_AUTHOR_NAME=$(git show -s --format=%an $(git rev-parse HEAD))'吗?
  • 我怀疑即使使用导出,环境变量也不会进入 GIT。
【解决方案2】:

我使用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

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 2013-01-23
    • 2014-09-29
    • 2021-02-22
    • 2019-11-14
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多