108

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.
4

6 に答える 6

137

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

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

より完全な情報は他の場所で見つけることができます:

于 2013-01-18T18:45:13.910 に答える
36

まず、ここですでに説明した方法で現在のサブモジュールを削除します。これは便宜上含めています。

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

--name次に、フラグを付けて新しいサブモジュールを追加します。.git/configこれにより、gitにサブモジュールを参照するための代替名が付けられ、以前の履歴で引き続き作業したい、過去に存在していたサブモジュールとの競合が解消されます。

したがって、次のように入力します。

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

そして、あなたはあなたが期待するパスでロードされたサブモジュールを取得します。

于 2013-01-18T17:52:39.323 に答える
5

これを修正したのは、gitリポジトリのルート(サブモジュールではありません)にあり、実行しました

rm -rf .git/modules/yourmodule

その後、通常どおり追加できるはずです。

于 2015-05-06T17:32:55.980 に答える
3

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

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

.gitmodules手動で変更するという考えは好きではありませんでした。それについての小さなブログ記事も書きました。

于 2014-07-16T13:57:33.783 に答える
2

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

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

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

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

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

于 2016-10-27T10:15:52.160 に答える