19

Git Repoには、3つのファイルが含まれるフォルダーがあり、すべての名前に、、、およびABCのスペースが含まれています。フォルダとファイルを削除したい。私はこのコマンドを介してファイルを削除する方法を知っているだけですfile - 1.extfile - 2.extfile - 3.ext

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
4

2 に答える 2

28

あなたがの歴史から始めたとしましょう

$ git lola --name-status
* e709131(HEAD、マスター)バー
| バー
* 61493acABC/ファイル-3.ext
| ABC/ファイル-3.ext
* 34cce9eABC/ファイル-2.ext
| ABC/ファイル-2.ext
* 115e6d5ABC/ファイル-1.ext
| ABC/ファイル-1.ext
* 5ea5b42 foo
  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

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

115e6d5cd06565ca08f1e5c98c4b91246cf59fa1(2/5)rm'ABC/file-1.ext'を書き換えます
34cce9e90f832460137e620ebacc8a73a99e64ce(3/5)rm'ABC/file-1.ext'を書き換えます
rm'ABC/ファイル-2.ext'
61493ac3211808f34f616dbc33d51d193b3f45a3(4/5)rm'ABC/file-1.ext'を書き換えます
rm'ABC/ファイル-2.ext'
rm'ABC/ファイル-3.ext'
e709131f1fe6103adf37616c9fa500994aeb30d0(5/5)rm'ABC/file-1.ext'を書き換えます
rm'ABC/ファイル-2.ext'
rm'ABC/ファイル-3.ext'

Ref'refs / heads/master'が書き直されました

結果に満足している場合は、で古いマスターを削除します

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

そして今、あなたはの歴史を持っています

$ git lola --name-status
* 19680d4(HEAD、マスター)バー
| バー
* 5ea5b42 foo
  foo

2番目の質問に答えるために、削除したいABC/file - 2.extだけだと言います。2層の引用符が必要になることを忘れないでください。1つはコマンド全体用で、もう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、マスター)バー
* cff0c4e ABC /file-3.ext
* 115e6d5ABC/ファイル-1.ext
* 5ea5b42 foo
于 2012-12-21T14:49:26.053 に答える
14

を使用する代わりに、次の--index-filterコマンドを試してください--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
于 2012-12-21T12:54:42.290 に答える