2012-12-21 7 views
14

Git Repoには、file - 1.extfile - 2.ext、およびfile - 3.extという名前のスペースを持つ3つのファイルを持つABCというフォルダがあります。私は、フォルダとファイルを削除したいと思います。私は、このコマンド前のすべてのコミットからディレクトリを削除します

git filter-branch --index-filter 'git rm --cached --ignore-unmatch FILE' \--prune-empty --tag-name-filter cat -- --all

あなたgit push origin master --force経由でファイルを削除する方法しか認識しています。

(1)しかし、フォルダABCとそれ以前のすべてのコミットからそのファイルを削除するにはどうすればよいですか?

はまた、ファイルは、名前にスペースを持っているし、次のレポでそれらを検出していませんがコミット:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file\ -\ 1.ext' \--prune-empty --tag-name-filter cat -- --all 

(2)構文は、名前にスペースを持つファイルを削除するにはどうあるべきか? ノート

  • OSX
  • githubの代わりに--index-filterを使用しての
+2

になったでしょうか?コミットはプロジェクトのスナップショットです。いくつかのディレクトリやファイルを削除する場合は、プロジェクトから削除する新しいコミットを作成する必要があります。 –

+12

@WouterJリポジトリの履歴から不要な大きなファイルを削除したり、機密情報のあるファイルを削除することができます。 –

答えて

20

あなたが

$ git lola --name-status 
* e709131 (HEAD, master) bar 
| A  bar 
* 61493ac ABC/file - 3.ext 
| A  ABC/file - 3.ext 
* 34cce9e ABC/file - 2.ext 
| A  ABC/file - 2.ext 
* 115e6d5 ABC/file - 1.ext 
| A  ABC/file - 1.ext 
* 5ea5b42 foo 
    A  foo

ノートの歴史で始まる言う:git lola非標準が、非常に便利な別名です。

git rmは、サブツリーを削除するオプションをサポートしています。

-r
大手ディレクトリ名が与えられたときに再帰的に削除を許可します。

$ git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch ABC' \ 
    --prune-empty --tag-name-filter cat -- --all

を実行した後、あなたは結果に満足している場合は、今

$ git update-ref -d refs/original/refs/heads/master

で古いマスターを削除し、

Rewrite 115e6d5cd06565ca08f1e5c98c4b91246cf59fa1 (2/5)rm 'ABC/file - 1.ext' 
Rewrite 34cce9e90f832460137e620ebacc8a73a99e64ce (3/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
Rewrite 61493ac3211808f34f616dbc33d51d193b3f45a3 (4/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
rm 'ABC/file - 3.ext' 
Rewrite e709131f1fe6103adf37616c9fa500994aeb30d0 (5/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
rm 'ABC/file - 3.ext' 

Ref 'refs/heads/master' was rewritten

に似た出力が表示されます。

の履歴があります
$ git lola --name-status 
* 19680d4 (HEAD, master) bar 
| A  bar 
* 5ea5b42 foo 
    A  foo

2番目の質問に答えるには、ABC/file - 2.extのみを削除するとします。クォーテーションの2つの層が必要であることを覚えておいてください:コマンド全体のための1つの層と、そのコマンドの引数の中のスペースをエスケープするもう1つの層、削除するファイルの名前。そうする

一つの方法は、

$ git filter-branch --index-filter \ 
    'git rm --cached --ignore-unmatch "ABC/file - 2.ext"' --prune-empty \ 
    --tag-name-filter cat -- --all

ある単一引用符内の二重引用符に注意してください。

あなたの代わりにこのコマンドを実行していた場合、あなたは彼らがすべてのコミットから削除するなぜ、あなたの歴史は

$ git lola 
* a8d1b0d (HEAD, master) bar 
* cff0c4e ABC/file - 3.ext 
* 115e6d5 ABC/file - 1.ext 
* 5ea5b42 foo
11

--tree-filterで試してみてください。

--tree-filter <command> 
    This is the filter for rewriting the tree and its contents. The argument is 
    evaluated in shell with the working directory set to the root of the 
    checked out tree. The new tree is then used as-is 
    (new files are auto-added, disappeared files are auto-removed - 
    neither .gitignore files nor any other ignore rules HAVE ANY EFFECT!). 

コマンドライン:

git filter-branch --tree-filter 'rm -rf path/to/ABC' \ 
    --prune-empty --tag-name-filter cat -- --all 
関連する問題