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


155

gitサブモジュールディレクトリの名前を変更する簡単な方法はありますか(それを削除して新しい宛先名で再度追加するという全体の動きを経る以外に )。

そして、私たちがそうしている間に、なぜ親ディレクトリで次のことを実行できないのですか? git mv old-submodule-name new-submodule-name


6
.gitmodulesサブモジュールを移動するときに手動で更新する必要はなくなります。以下の私の回答を
VonC

@VonCの答えは私の魅力のように働きました
laconbass

Gitモジュールは複雑すぎる。npmシンプルな仕組みを示します。ある日...多分...誰か...それを書き直します...その間...
Rolf

@VonCの答えは今日の話ではありません。それは確かに.gitmodulesを変更しますが、モジュール名ではなくパスの名前を変更するだけです。それを修正するには.gitmodulesをさらに編集し、プロセス全体を完了するには 'git submodule sync'を実行する必要があります
zertyz

@zertyz:プロパティ[サブモジュール "name_of_submodule"]はGitの内部名です。混乱しないように名前を変更できますが、これは単なるラベルです。
MKesper

回答:


101

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

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

注:この方法では、GITの2018バージョンでインデックスと.gitmodulesが正しく更新されません。

注:VonC回答git mv oldpath newpathで指摘されているように、今すぐ実行できる場合があります。(gitの最新バージョンを使用していることを確認してください)


22
自己注意:git add newpath末尾にスラッシュを使用しないでください
原子番号

10
このようなワークフローでは、サブモジュールとして使用するサブディレクトリへのシンボリックリンクのみを作成します。Symlinkは、グローバルサブモジュール機能の一部にすぎません。:これは、あなたが名前を変更したサブモジュールを使用レポのクローンを作成する場合、次のエラーで終了し得ることを意味 はありませんサブモジュールのマッピングがパスの.gitmodulesで見つかった「あなたの-oldpathが」あなたはoldpathのを削除した後(* gitのRM oldpathが)、あなたがすべき使用gitのサブモジュールの追加REPO-URLのnewpathのを代わりにgitの追加newpathを」の*完了したら、gitのステータスは次のようなものが表示されます:名前を変更:。oldpathが- > newpathを
ベルトラン

5
git addコマンドを使用すると、サブモジュールがサブモジュールとしてではなく、単純なディレクトリとしてプロジェクトに含まれるため、このソリューションは機能しません。$ mv submodule-oldpath〜/ another-location $ git rm submodule-oldpath $ git submodule add submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoudアダム

3
作業ツリーに問題がある場合は、.git/modules/SUBMODULE/configファイルを編集して、worktreeポイントが正しいディレクトリを再び指すようにすることもできます。
Vincent Ketelaars 2014

3
これはgitでは機能しませんでした2.13.1。しかし、単純に行うことgit mv old newは魅力のように機能します。変更を完了するには、git commitを実行するだけです。
ユーザー

225

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

git mv A B

" git mv A B"、サブモジュールAを移動すると、その作業ツリー.gitmodules再配置し、ファイル内のパスを調整するように指示されました


コミットで詳細を見る0656781fadca1

現在git mvサブモジュールで「」を使用すると、サブモジュールの作業ツリーがスーパープロジェクトの作業ツリーに移動します。しかし、サブモジュールのパス設定.gitmodulesは変更されずに残されています。これは現在、作業ツリーと整合性がなく、適切なpath -> name mappingstatusおよびのようなdiff)に依存するgitコマンドが奇妙な動作をするようになっています。

git mvサブモジュールの作業ツリーを移動するだけでなくsubmodule.<submodule name>.path.gitmodulesファイルと設定の両方から" "設定を更新することにより、ここで" "を支援します。
これは、.gitmodulesファイルが見つからない場合は発生せず、このサブモジュールのセクションがない場合にのみ警告を発行します。これは、ユーザーが.gitmodulesファイルなしで単純なgitlinksを使用したり、「git mv」コマンドを発行する前に手動でパス設定を更新したりしているためです(この場合、警告により、ユーザーに代わってそれを実行したことが通知されますmv)。が見つかり、マージの競合が含まれている
場合にのみ.gitmodulesmvコマンドは失敗し、ユーザーに再試行する前に競合を解決するように通知します。


git 2.9(2016年6月)はgit mvサブモジュール用に改善されます:

参照してくださいa127331コミットすることにより(2016年4月19日)ステファンBellerを(stefanbeller
(合併によりJunio C浜野- gitster-9cb50a3コミット 2016年4月29日)

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

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

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


自分への注意:1.8.4で試してみてくださいfatal: source directory is empty, source=my_source, destination=my_destination。1.8.5の安定版リリース時に、これを再試行します。
チェックサム

@checksumしかし、1.8.5には少なくとも数時間は安定したリリースがあります。;)github.com/git/git/releases/tag/v1.8.5
VonC

UbuntuリポジトリにはGit v.1.7.5があるため、ソースコードからGitバージョン1.8.5.GITをビルドする必要がありました。ソースコードからGitを構築する方法
Maksim Dmitriev

2
@MaksimDmitrievしかし、私がstackoverflow.com/a/20918469/6309で言及したppa(Personal Package Archive)はどうですか?
VonC、2014年

1
私のマシンではgit mvがこの目的で機能しません。
Alexander Dyagilev


11

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

$ 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!


7

名前を変更することはできないため、まず削除して(deinit)、もう一度追加する必要があります。

それを削除した後:

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

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

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

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

git commit -am 'Removing submodule.'

未解決の問題がないかどうかを次の方法で再確認します。

git submodule update
git submodule sync
git submodule status

これでgitサブモジュールを再び追加できます:

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

また、実際には今日です
Alexey

質問のタイトルは誤称です。名前ではなくパスに関係しています
Max Robbertze

3

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

git submodule sync後で行う必要があるかもしれませんが、今は確認する立場にはありません。


これにより、新しいサブモジュール名は、名前の変更ではなく新しいコミットとして発生します。しかし、たぶんこれがそうでなければならない方法ですか?
Lars Tackmann、2010

1
@Lars:古いサブモジュールディレクトリも必ず削除してください!
Cascabel

3

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

git mv Common common

私は得る

致命的: '共通'の名前変更に失敗:無効な引数

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

git mv Common commontemp
git mv commontemp common

それで全部です :)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.