web-dev-qa-db-ja.com

gitサブモジュールの名前を変更する

Gitサブモジュールディレクトリの名前を変更する簡単な方法はありますか( 削除 itの動作全体を行って、新しい宛先名で再追加する以外)。

そして、私たちがそれに取り組んでいる間に、なぜ親ディレクトリで次のことができないのですか:git mv old-submodule-name new-submodule-name

133
Lars Tackmann

次のワークフローが機能していることがわかりました:

  • .gitmodulesを更新する
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

注:このアプローチでは、GITの2018バージョンでインデックスと.gitmodulesが適切に更新されません。

90
Mariusz Nowak

Git1.8.5(2013年10月)はプロセスを簡素化する必要があります 。単純に:

_git mv A B
_

「_git mv A B_」、サブモジュールAを移動すると、その作業ツリーをに再配置し、_.gitmodules_ファイルのパスを調整するように指示されました


詳しくは commit 0656781fadca1

現在、サブモジュールで「_git mv_」を使用すると、サブプロジェクトの作業ツリーがスーパープロジェクトの作業ツリーに移動します。ただし、_.gitmodules_のサブモジュールのパス設定は変更されず、作業ツリーと矛盾し、適切な_path -> name mapping_(statusdiffなど)に依存するgitコマンドが奇妙な動作をするようになりました。

サブモジュールの作業ツリーを移動するだけでなく、_git mv_ファイルから "_submodule.<submodule name>.path_"設定を更新し、両方をステージングすることにより、ここで "_.gitmodules_"を助けましょう。
これは_.gitmodules_ファイルが見つからない場合は発生せず、このサブモジュールのセクションがない場合にのみ警告を発行します。これは、ユーザーが_.gitmodules_ファイルなしで単純なgitlinksを使用するか、「git mv」コマンドを発行する前に既に手動でパス設定を更新している可能性があるためです(この場合、mvは彼)。
_.gitmodules_が見つかり、マージの競合が含まれる場合のみ、mvコマンドは失敗し、再試行する前に競合を解決するようユーザーに指示します。


git 2.9(2016年6月)は、サブモジュールの_git mv_を改善します:

commit a127331 (2016年4月19日)by Stefan Beller(stefanbeller を参照してください。
C浜野順夫-gitster- in commit 9cb50a 、2016年4月29日)

mv:ネストされたサブモジュールの移動を許可します

「_git mv old new_」は、_old/_ディレクトリ内のサブディレクトリとして存在するサブモジュールのパスを正しく調整しませんでした。

ただし、サブモジュールはgitディレクトリへのリンクと_.gitmodules_ファイルへの更新を更新する必要があります。

194
VonC
$ mv submodule-oldpath submodule-newpath
$ git rm submodule-oldpath
$ git add submodule-newpath
$ git submodule sync

Git addコマンドを使用する場合、サブモジュールはサブモジュールとしてではなく、単純なディレクトリとしてプロジェクトに含まれていたため、この解決策はうまくいきません。

正しい解決策は次のとおりです。

$ mv submodule-oldpath ~/another-location
$ git rm submodule-oldpath
$ git submodule add submodule-repository-URL submodule-newpath

ソース: http://bcachet.github.io/development/2012/05/25/rename-git-submodule/

9
Mahmoud Adam

上記の提案をいくつか試しました。私は走っています:

$ git --version
git version 1.8.4

サブモジュールを非初期化し、ディレクトリを削除して新しいサブモジュールを作成するのが最善であることがわかりました。

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

少なくともそれが私にとって最もうまくいったことです。 YMMV!

9
jaredwolff

名前を変更することはできないため、最初に削除(deinit)してから再度追加する必要があります。

それを削除した後:

git submodule deinit <path>
git rm --cached <path>

次の場所で参照を再確認して削除することもできます。

  • .gitmodules
  • .git/config
  • 各フォルダーにはconfigへの参照を保持するworktreeファイルがあるため、.git/modules/<name>から参照フォルダーを削除します(バックアップを作成するのが最善です)

次に、リポジトリに変更をコミットして変更をステージングします。

git commit -am 'Removing submodule.'

未解決の問題がないかどうかを再確認してください:

git submodule update
git submodule sync
git submodule status

そのため、gitサブモジュールを再度追加できます。

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
4
kenorb

.gitmodulesファイルを編集してサブモジュールの名前を変更し、サブモジュールディレクトリの名前を変更します。

git submodule syncその後、しかし、私は今チェックする立場にありません。

3
Abizern

MacOsVonC solution を使用してサブモジュールフォルダーCommonを小文字に変更する場合:

git mv Common common

私は得る

致命的:「Common」の名前変更に失敗しました:無効な引数

解決策-一時フォルダー名を使用して2回移動します。

git mv Common commontemp
git mv commontemp common

それで全部です :)

2