2016-04-27 9 views
0

私はgit filter-branchを使い、.gitignore(後でブランチにrebased)からなる自分のintit commitを有効にしようとしています。私の最初のコミットを尊重したgit filter-branch .gitignore

これは私が実行するものである:

git filter-branch -f --tree-filter 'git rm -r --cached . && git add .' --prune-empty 

このコマンドは、しかし、そのままリポジトリを残します。

なぜですか?

次のコマンドは、リポジトリ内のすべてのファイルを削除しない理由、私も疑問に思う:

git filter-branch -f --tree-filter 'git rm -r --cached .' 

答えて

2

--tree-filterはインデックスに/上動作しません。 代わりに、各コミットを作業ツリーとして使用される一時ディレクトリにコピーし、その一時ディレクトリでコマンドを実行し、一時ディレクトリに残っているファイルや新しいファイルから新しいコミットを外します。このプロセス中にインデックス自体に加えた変更は、事実上無視されます。

これは、新しい.gitignoreが追加されなかったファイルを作業ツリーから削除する必要があることを意味します。 のgit rm --cachedでこれを手動で行うことができます。これははるかに速くなりますが、--tree-filterでgitにあなたの仕事をさせたい場合は、同じトリックgit自身を使用することができます(脚注参照):use git clean-x)を使用して一時ディレクトリをクリーンアップします。


これはかなり真実ではありません。filter-branch--tree-filterコードは(再)の前に、インデックスを設定するためにgit read-treeを使用して順番にそれが出てきれいにするいくつかの作業を行うために有することを意味する一時ディレクトリを(移入直前のコミットからの一時ディレクトリ。そのディレクトリにはgit cleanが使用されます)。次に、evalフィルタを実行した後、再度インデックスを使用して、一時ディレクトリで実行された内容を検査します。 git rm -r --cached .とそれに続いてgit add .を入力すると、無視されたファイルが存在しない結果インデックスが作業ツリーと比較され、... は無視されたファイルを追加します。アー!それは、ファイル名にスペースをサポートしていない以外

0

このソリューションは、動作します:

git filter-branch -f --tree-filter 'ls -r | xargs --no-run-if-empty \ 
git check-ignore --no-index | xargs --no-run-if-empty rm' --prune-empty 

また、git check-ignoreに作業ディレクトリ内のすべてのファイル(再帰的)の、すなわちリストを極端に長い行を生成します。 git check-ignoreは再帰を単独で処理できませんか?そしてファイル名のスペース、それらをサポートする方法は?

関連する問題