3

この質問は、git 履歴の書き換えに関するものです。6 か月前に、リポジトリの既存のサブフォルダーに変更を加えることにしましたが、気が変わって、それと関連するすべての履歴を元に戻したいと考えています。サブフォルダーの外側の変更はそのままにしておく必要があることに注意してください。

したがって、具体的には、特定の日付以降、レポのサブフォルダーの 1 つで行われたすべての変更の履歴を削除しようとしています。

私が望んでいる最終結果は、その日付以降にサブフォルダーで編集/追加/削除が行われたことがないように見えるはずです.

Remove file from git repository (history)への回答、およびhttp://dalibornasevic.com/posts/2-permanently-remove-files-and-folders-from-a-git-repositoryへの回答を見ると、最も近い私これは次のとおりです。

git filter-branch --index-filter 'git rm -r -f --cached --ignore-unmatch TheFolderToRemove' --prune-empty --all xxxxxx..HEAD 
git reset --hard
git remote rm origin
rm -r .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive
git prune

これにより、サブフォルダー内のすべてのファイルが削除されます。

誰かがこれを変更して、フォルダ内に適用された変更を削除する方法を教えてもらえますか? どうもありがとう

4

2 に答える 2

4

filter-branchwithを実行するとgit rm --cached、gitにディレクトリを削除し、その削除をステージングするように指示します。それはあなたがそれをするように言ったことだけをしました。

元のオブジェクトがまだある場合:( つまり、実際に実行していないgc場合prune

ディレクトリ自体を削除するのではなく、インデックスからそのディレクトリへの変更をステージング解除するために使用git resetします。

$ git filter-branch --index-filter 'git reset -q xxxxxx TheFolderToRemove' \
>     --prune-empty -- --all xxxxxx..HEAD

フォルダを配置する状態のコミットはどこにxxxxxxありますか。

元のオブジェクトがまだない場合:(つまり、リポジトリから古いツリーを削除した場合)

フォルダが削除されたと表示されているコミットをチェックアウトし(後のコミットであると思いますxxxxxx)、削除を元に戻し、コミットを修正して、残りの履歴を一番上にリベースします。

$ git checkout -b temp <commit_after_xxxxxx>
$ git checkout HEAD^ <removed_folder>
$ git commit --amend
[temp abcdef1] <message>

次に、masterが唯一のブランチである場合:

$ git rebase --preserve-merges temp master
于 2012-06-27T14:15:57.760 に答える