アップデート
私の古い回答は、元の投稿者が彼の問題を部分的に解決するのに役立ったようですが、Git コマンドでのみ動作するというのは実際には正しくないよう--index-filter
です。 Git コマンドに加えて、シェル コマンド:git filter-branch
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
上記のドキュメントの例に示すように、 Git 以外のコマンドを で使用する場合は--index-filter
、リポジトリのインデックスを操作する必要がある場合があります。
基本的に、元の投稿者の元のインデックス フィルターが機能しなかった理由はわかりませんが、インデックス フィルターがアクセスを許可していないリポジトリの一部にアクセスしようとしていた可能性があります。彼が使用していた Git 以外のコマンドは、実際にはインデックスを変更しませんでした。
また、コメントで指摘したように、
Git は実際にはすべての参照を.git/refs/
作業コピーのルートにある非裸のリポジトリに保存します...そのため、コマンドfind . -name refs -depth
は実際にそれらのディレクトリも掘り下げます。
それで、フィルター分岐中に何かがひどく間違っている可能性がありますか?
古い回答
filter-branch --index-filter
問題は、オプションの代わりにオプションでGit以外のシェルツールを使用しようとしている可能性があると思い--tree-filter
ます:
git filter-branch --index-filter \
'find . -name refs -depth -exec git rm -rf --cached --ignore-unmatch {} \;' \
--prune-empty --tag-name-filter cat -- --all
--tree-filter
コミットごとに新しい作業ディレクトリをチェックアウトし、渡されたシェル スクリプトを実行する とは異なり、 --index-filter
Git リポジトリ自体のインデックス ファイルのみを操作します (作業コピーをチェックアウトして操作することはありません)... Git コマンドのみが動作します。
Git コマンドを に渡したので、おそらくこれで運が良かったのでしょうfilter-branch --index-filter
。
git filter-branch --index-filter \
'git rm -f --cached --ignore-unmatch *.zip && \
git rm -rf --cached --ignore-unmatch refs' \
--prune-empty --tag-name-filter cat -- --all
これはgit-filter-branch(1) のドキュメントです--tree-filter
:
これは、ツリーとその内容を書き換えるためのフィルターです。引数は、チェックアウトされたツリーのルートに設定された作業ディレクトリを使用して、シェルで評価されます。
--index-filter
そして、これは(強調鉱山)のドキュメントです:
これは、インデックスを書き換えるためのフィルターです。これは tree フィルタに似ていますが、 tree をチェックアウトしないため、はるかに高速になります。でよく使用されgit rm --cached --ignore-unmatch ...
ます。以下の例を参照してください。複雑なケースについては、git-update-index(1)を参照してください。