6

削除したい機密コンテンツを含むソースファイルを持つgitリポジトリがあります(ファイルを削除したくないので、そのコンテンツを修正するだけです)。コミットは、プロジェクト開発のかなり早い段階 (ブランチが 1 つしかなかったとき) でしたが、現在は他の n 個のブランチでその役割を果たしています。

すべてのブランチでクリーンアップするために実行できる git-fu はありますか? インタラクティブなリベースは、一度に 1 つのヘッドのみを機能させます。

私はgithubでこのコマンドを見つけました:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch DotNet/src/ExternalLibs/GemBox/' \
--prune-empty --tag-name-filter cat -- --all

ただし、削除に対してのみ機能し、修正に対しては機能しません

A-B-C-**STUPID**-D-E-F
                    \
                     \-G-H-I
                          \-J-K
4

1 に答える 1

3

修正されたコンテンツも機密ではないと仮定すると、これはうまくいくかもしれません: 修正したいコミットで新しいブランチをチェックアウトし、ファイルを修正してから、以前に修正されていない後のすべてのマージを保持する非インタラクティブなリベースを使用します新しい修正されたコミットにコミットします。

# Checkout a branch "fix" at the commit STUPID
git checkout -b fix STUPID

# Make your file changes...

# Amend STUPID
git add .
git commit --amend -m "REDACTED MWA-HA-HA!"

# Do the BIGGEST rebase that you'll probably ever do in your entire life!
git rebase --preserve-merges --onto fix STUPID master
# or `-p` for short
git rebase -p --onto fix STUPID master

# Verify that the only difference between master and master@{1}
# is the amended content:
git diff master@{1} master

リベースの前後の唯一の違いがmaster修正されたコンテンツであることを確認したら、reflog を期限切れにして次のコマンドを実行して、古いコミットのローカルおよびリモート リポジトリをパージすることをお勧めしますgit gc

git reflog expire --expire=now --all
git gc --prune=now

実行する必要があるその他のクリーンアップ手順については、次を参照してください。

  1. 機密ファイルとそのコミットを Git 履歴から削除します
  2. GitHub: 機密データを削除します

ところで、何か問題が発生した場合に備えて、所有しているレポの唯一のコピーでこれを試す前に、まず別のローカル クローンでリベースをテストしてください。

そうそう、私はほとんど忘れていました。あなたの修正STUPIDがその上にリベースされているコミットと競合する場合、リベース中にそれらの競合を修正する必要があります。

この 1337 の git-fu は、 Cupcakeの厚意により提供されました: 2012 年以来、git リポジトリで開心術を行っています ;)

于 2014-04-08T17:46:11.560 に答える