2017-05-02 11 views
1

Windowsのブランチをチェックアウトしているときに問題に直面しています。 1つのフォルダが空のスペースで終わり、gitは元のパスにファイルを置いてエラーを起こそうとしている間に、ウィンドウに自動的にフォルダをトリミングします。Gitのフォルダの名前を変更します。すべてのブランチとすべてのリビジョン

fatal: cannot create directory at 'raisesoft/61571_delivery /acl': No such file or directory 

Linuxの場合、Linuxは自動的にフォルダをトリミングしないため、正常に動作します。

私はそのフォルダの名前を変更しようとしています。これは私が思いついたスクリプトです:

git filter-branch --tree-filter ' 
if [ -d "61571_delivery " ]; then 
    mv "61571_delivery " "61571_delivery" 
fi' --force HEAD 

しかし、それは動作しません。フォルダの名前はまったく変更されませんでした。私はLinuxのbashに堪能ではないので、ほとんど助けが大いに評価されるだろう。

ありがとうございました

+0

Linux上でうまくいけば、Linux上で手動でディレクトリの名前を変更した後でコミットを試してみてください。 – ashmaroli

+0

このコマンドは、repoルートのディレクトリを探します。エラーメッセージから、実際にはリポジトリのサブディレクトリにあるという印象を受けました。スクリプト内のパスを限定するだけですか? –

+0

他のいくつかの注意点: 'filter-branch'引数の最後に' - --all'を追加したいと思うかもしれません(すべてのリビジョンを言ったので)。レポが非常に大きい場合、これはかなりの時間がかかります(既存のすべてのバージョンを完全にチェックアウト、更新、再コミットする必要があるため)。また、まだ計画していない場合は、操作によってすべてのコミットのSHA1 IDが変更され、このレポのすべてのユーザーまたはすべてのユーザーに対してカットオーバ手順が必要になります。 –

答えて

1

あなたは基本的に正しいトラックにあります。あなたのツリーフィルタは間違った名前を探しています。ディレクトリのパス名ではありません。

"61571_delivery " 

(それを明確にするために引用符を必要と末尾のスペースで完了)のではなく、:

したがって
"raisesoft/61571_delivery " 

git filter-branch --tree-filter ' 
if [ -d "61571_delivery " ]; then 
    mv "61571_delivery " "61571_delivery" 
fi' --force HEAD 

は次のとおりです。

git filter-branch --tree-filter ' 
if [ -d "raisesoft/61571_delivery " ]; then 
    mv "raisesoft/61571_delivery " "raisesoft/61571_delivery" 
fi' --force HEAD 

(そして一度テストしてそれが動作することを確認したら、--allに切り替え、--tag-name-filter catを追加して注釈付きタグを変更します)。

--tree-filterは、が極端にです。大きなリポジトリでは、(SSDやメモリファイルシステムではなく)回転メディアでこれを行うには、数日から数週間かかることがあります。メモリファイルシステムを使用することで速度を大幅に上げることができますが、最大のスピードアップは--tree-filterではなく--index-filterを使用することです。ツリーフィルタを使うと、インデックスから各コミットを通常のファイルシステムツリーに抽出し、フィルタを実行した後、ツリーを新しいコミットを書くために使用できるインデックスに戻す必要があります。 git filter-branchの部分はファストではありませんが、これは最も遅い部分です。索引フィルタを使用すると、Gitはこのステップを完全にスキップします。単にコミットを索引に読み込み、索引フィルタを実行してから、索引から新しいコミットを書き込みます。

残念ながら、これを行うインデックスフィルタを作成するためのすぐれた方法はありません。基本的にGitに相当するhg mv --afterには、インデックスのみのファイルの名前を変更したいが、Gitはそれを持っていない。私はa script that does this for one fileと書いていますが、ディレクトリ内のすべてのファイルに対して実行します。

+0

Huh。私は 'git mv --cached'がないことに驚いています。 –

+0

@DanielH:there should be be! – torek

+0

それはトリックでした。ありがとうtherek。 – Davita

関連する問題