gitサブモジュールを別のリポジトリに置き換えるにはどうすればよいですか?


95

gitサブモジュールを別のgitリポジトリに置き換えるにはどうすればよいですか?

具体的には、サブモジュールがあります。

  • ある./ExternalFrameworks/TestFrameworkgitのレポにそのポイントgit@github.com:userA/TestFramework.git
  • 私はそれが今ポイントするようにしたいと思いgit@github.com:userB/TestFramework.gitます。

問題は、ここで説明さている方法でサブモジュールを削除した後、コマンドを使用して再度追加することです

git submodule add git@github.com:userB/TestFramework.git

私はこのエラーを受け取ります:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

回答:


122

サブモジュールの場所(URL)が変更された場合は、次のように簡単にできます。

  1. .gitmodule新しいURLを使用するようにファイルを変更します
  2. リポジトリ内のサブモジュールフォルダーを削除する rm -rf .git/modules/<submodule>
  3. 作業ディレクトリのサブモジュールフォルダを削除します rm -rf <submodule>
  4. 走る git submodule sync
  5. 走る git submodule update

より完全な情報は他の場所にあります:


4
また、注目に値する:すでにサブモジュールを初期化している別のユーザーが更新を取得した場合、新しいサブモジュールが機能する前に、「git submodule sync」を1回実行する必要があります。
joseph.hainline 2013

2
これは私にはうまくいきませんでした。私のサブモジュールは、この後も古いURLを指しています。何かアイデアはありますか?
Arne

34
@Arneたぶん、サブモジュールが正しく初期化されなかった可能性があります。それがrm -rf .git/modules/<submodule>私のために働く前に、私はしなければなりませんでした。
David Braun

@DavidBraun私がやっても@Arneと同じ問題を抱えているgit submodule syncの後にrm -rf .git/modules/<submodule>なりますfatal: Not a git repository: ../.git/modules/<submodule>。任意のヒント?私は最初にgit submodule add https://<submodule-url>git docsに従ってサブモジュールを作成しました...
acannon828

1
その後、モジュールのディレクトリにcdし、目的のブランチをgit checkoutしてから、git pullを実行する必要がありました。
Nicolas Raoul 2014

34

最初に、ここですでに述べた方法で現在のサブモジュールを削除します。

  • .gitmodulesファイルから関連セクションを削除します
  • から関連セクションを削除 .git/config
  • 実行git rm --cached path_to_submodule(末尾のスラッシュなし)
  • 追跡されなくなったサブモジュールファイルをコミットして削除する

次に、--nameフラグを使用して新しいサブモジュールを追加します。これにより、gitに.git/configサブモジュールを参照するための代替名が与えられ、過去に存在していたサブモジュールとの競合が解消されます。

だからタイプ:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

期待するパスにサブモジュールがロードされます。


2
この方法は機能しますが、Timの方法ほどきれいではありません。
joseph.hainline 2013年

4
これは私にとってはうまくいったが、私も削除しなければならなかった.git/modules/<path_to_submodule>
2014

1
への参照に感謝します--name。私はこれを取り巻く問題に気づかず、このオプションを使用するまでサブモジュールを置き換えることができませんでした(回答に感謝します)。
aknuds1 2015年

これは、私に有効な唯一の方法であることがわかりましたが、同じディレクトリ名を保持したいと考えました。正しいパスをチェックアウトし、モジュール名を目的の名前にしましたが、作業ディレクトリ名は新しいリポジトリ名でした。:あなたが同じ名前にしたいのであれば、あなたはまた、のようなので、URLの最後にそれを指定する必要があります git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
RGB

8

これらのコマンドは、ローカルリポジトリのファイルを変更せずに、コマンドプロンプトで作業を行います。

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote

5

これを私のために修正したのは、あなたのgit repo(サブモジュールではない)のルートにありました、実行します

rm -rf .git/modules/yourmodule

その後、通常どおり追加できます。


3

私が見つけた最も簡単な方法はこれです:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

.gitmodules手動で変更するというアイデアは好きではありませんでした。私はそれについて少しブログ記事も書きまし


2

このクローンのリモートURL のみを変更する場合:

git config submodule."$submodule_name".url "$new_url"

これは.gitmodules親プロジェクトのファイルには影響しないため、他の開発者に伝播されることはありません。

これは、ここでは「ユーザー固有のレコード変更」として説明されています

git submodule sync再びデフォルトのURLにリセットされるため、実行しないでください

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