git
名前の変更/移動を明示的に追跡せず、同一の(または状況によっては類似した)ファイルを探すことを好むさまざまなFAQを読みました。それは素晴らしいことですが、この状況に対処できます。友人のリモートリポジトリには、にいくつかの新しいファイルを含む新機能(i18n)がありますdebian/po/*.po
。私はこのプロジェクトの独自のフォークを持っており、この機能をマージしたいのですが、ファイルをそのまま配置しますpo/*.po
(2つのコミット、または必要なものとしてそれを行うことができます)。リモートリポジトリは引き続き機能の更新を受信することを期待しています。これらのコミットをマージ/チェリーピックして、新しい場所のファイルに適用したいと思います。git
おそらく「これらのファイルは今ここに移動しました」のある種のマッピングでそれを行うことができますか?それともそれよりも苦痛ですか?debian
私のレポのパス?
3 に答える
使用git mv
し、すべてがAOKになります。
尋ねる代わりに試してみませんか?gitでいつでも簡単にリセットできます。:)
Gitには、2つのプロジェクト/ブランチなどの間で差分を行うときに、パスの名前変更と更新があることを期待することを示すメカニズムがありません。
利用可能なさまざまなファイル名変更オプション(-Mや--patienceなど)がありますが、時間がかかる場合があります。
すでに述べたように、パスの名前変更は、コンテンツ(ブロブ)と構造(ツリーノード)のスナップショットであるため、リポジトリ自体には影響しません。行ったすべてが追加のトップレベルディレクトリに追加された場合、以下のすべてのツリーとBLOBは変更されず、追加のストレージは必要ありません。必要なのは、コミット用の1つのツリーノードと新しいTLD用の1つのツリーノードだけです。簡単に死ぬ。Gitはその部分を問題なく処理します。
重要なのは、比較(およびパッチ)を実行する場合のみです。-P
いくつかのパスの名前変更を期待し、diff
それによって簡単に対処できることを示すオプションがあると便利です。200個のファイルが削除されて200個の新しいファイルが表示されるのは良くありません;-)
-Pオプションを追加する方法を見つけることは、私の「やること」リスト項目のもう1つです(少し時間があればいいのですが)。
または、を使用してファイルの名前を変更しmv
、呼び出しgit add --all
てすべての削除操作をステージングし、追跡されていないファイル(新しいファイル名)を追加します。がない--all
場合は、削除操作と新しいファイル名を別々に明示的にステージングする必要があります。も使用しないでくださいgit add --update
。これにより、すべての削除操作がステージングされますが、新しいファイル名は追加されません。
これらの操作をローカルブランチで実行して、誤っpush
て友人のマスターブランチに移動したり、友人がマスターブランチに移動したりしないようにする必要があることに注意してくださいpull
。