10

そのため、を使用してリポジトリ内のフォルダーの名前を変更しようとしていますが、git filter-branch --index-filter常に「致命的: ソースが正しくありません」というエラーが発生します。

この問題は、フォルダーの代わりにファイルを使用するテスト リポジトリで簡単に示されます。

準備:

$ git init
$ echo whatever >> my_file.txt
$ git add .
$ git commit -m "initial"
$ echo whatever2 >> my_file2.txt
$ git add .
$ git commit -m "second"

今、私はに変更しようとしていmy_file.txtますyour_file.txt:

$ git filter-branch --index-filter 'git mv my_file.txt your_file.txt' HEAD

しかし、うまくいきません:

Rewrite dac9a2023bdf9dd0159fab46213d9e1342ae9f75 (1/2)fatal: bad source, source=my_file.txt, destination=your_file.txt
index filter failed: git mv my_file.txt your_file.txt

ただし、git mv通常実行される同じコマンドは問題なく動作します。

$ git mv my_file.txt your_file.txt
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    my_file.txt -> your_file.txt
#

確かに、ここで重要な何かが欠けていますが、それは何ですか?

4

2 に答える 2

15

twalbergが彼の回答で指摘しているように、git mvはインデックスにアクセスするだけでなく、ディスクにもアクセスします。それがおそらくそれが機能しない理由です。

スローを使用したくなかったので、完全なリポジトリをサブフォルダに移動する方法を示すマニュアルページ--tree-filterからサンプルを変更しようとしました。git filter-branch

結果はこれです-そしてそれは実際に機能します;-)

git filter-branch --index-filter '
git ls-files -s | \
sed "s-\(\t\"*\)my_file.txt-\1your_file.txt-" | \
GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && \
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
' HEAD
于 2013-02-22T17:14:25.880 に答える
4

git mv--index-filter節ではあまり適切ではありません。--index-filter各コミットをチェックアウトしないため、作業ディレクトリに書き換えられ、(インデックスに加えて) 作業ディレクトリで動作git mvするため、 in を使用git mv--index-filterても期待どおりの結果が得られません。--tree-filter代わりにaを使用してください。--index-filter(代わりに使用することでこれを達成できるかもしれませgit update-indexんが、私は頭の上からそれを利用することはできません).

于 2013-02-22T17:17:21.037 に答える