868

サブモジュールを含む git リポジトリを作成しました。サブモジュール自体にリモート リポジトリ パスを変更するように指示することはできますが、サブモジュールのリモート リポジトリ パスを変更する方法を親リポジトリに指示する方法がわかりません。

サブモジュールを削除することさえ簡単ではないので、運が悪くて手動でやらなければならない場合でも驚かないでしょう。

4

9 に答える 9

1177

ファイルを編集し.gitmodulesて URL を更新し、実行git submodule sync --recursiveしてその変更をスーパープロジェクトと作業コピーに反映するだけです。

.git/modules/path_to_submodule次に、ディレクトリに移動し、その構成ファイルを変更して git パスを更新する必要があります。

リポジトリの履歴が異なる場合は、新しいブランチを手動でチェックアウトする必要があります。

git submodule sync --recursive
cd <submodule_dir> 

git fetch
git checkout origin/master
git branch master -f
git checkout master
于 2009-05-27T05:25:39.867 に答える
192

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

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

スクリーンショットについては、ブログを参照してください: GIT サブモジュールの URL/ブランチを同じリポジトリの他の URL/ブランチに変更する

于 2015-06-05T20:17:48.367 に答える
186

Git 2.25(2020年第1四半期)では、Gitを変更できます。
GitサブモジュールのURLが変更されました」および新しいコマンドを参照してください

git submodule set-url [--] <path> <newurl>

--区切り文字については、「オプションの解釈を停止し、後続のすべての引数を文字通り処理するためのシグナルとしてのダブルハイフン」を参照してください)

警告:コメントでのHi-Angelの言及(Git 2.31.1でもテスト済み):

git submodule set-urlバグがあるので注意が必要です。

ファイル内.gitmodulesのパスが次のようになっている場合、 (末尾のスラッシュに注意してください)some-pathを実行すると、既存のサブモジュールを変更する代わりに、コマンドによって別のサブモジュールが追加されます。git submodule set-url some-path/ new-url/


元の回答(2009年5月、10年前)

実際、 2009年4月に役割を明確にするためのパッチが提出されました。gitmodule

そのため、gitmoduleのドキュメントにはまだ次のものが含まれていません。

git作業ツリーの最上位ディレクトリにあるファイルは、 linkgit.gitmodules:git-config4の要件に一致する構文を持つテキストファイルです。 [NEW]: このファイルはGitによって管理されているため、プロジェクトのサブモジュールの+レコードを追跡します。 このファイルに保存されている情報は、プロジェクト構成ファイルに保存されているレコードの信頼できるバージョンを準備するためのヒントとして使用されます。 ユーザー固有のレコードの変更(たとえば、ネットワークの状況によるサブモジュールURLの違いを説明するため)は構成ファイルに対して行う必要がありますが、伝播されるレコードの変更(たとえば、サブモジュールソースの再配置による)はこのファイルに対して行う必要があります。



それはジムの答えをほぼ確認します。


このgitサブモジュールチュートリアルgit submodule initに従うと、サブモジュールリポジトリのURLを.git/configに追加するために「」が必要であることがわかります。

" git submodule sync"は、URLが変更されたとき(特にサブモジュールの数が重要な場合)にそのタスクを簡単にするために、2008年8月に正確に追加されました。
そのコマンドに関連付けるスクリプトは非常に簡単です。

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

目標は残っています: git config remote."$remote".url "$url"

于 2009-05-27T05:40:27.497 に答える
80

私にとってうまくいったこと(Windowsでは、gitバージョン1.8.3.msysgit.0を使用):

  • 新しいリポジトリへの URL で .gitmodules を更新します。
  • 「.git/config」ファイルから対応する行を削除します
  • 「.git/modules/external」ディレクトリ (最近の git バージョンでは「.git/modules」) 内の対応するディレクトリを削除します。
  • チェックアウトしたサブモジュール ディレクトリ自体を削除します (これが必要かどうかは不明です)。
  • 実行git submodule initしてgit submodule update
  • チェックアウトされたサブモジュールが正しいコミットにあることを確認し、それをコミットします。ハッシュが異なる可能性があるためです

それをすべて行った後、すべてが私が期待する状態にあります。リポジトリの他のユーザーが更新するときに同様の痛みを感じると思いますが、コミットメッセージでこれらの手順を説明することをお勧めします!

于 2013-10-01T21:46:14.190 に答える
13

.git/configファイルを編集するだけです。例えば; 「共通」サブモジュールがある場合は、スーパーモジュールでこれを行うことができます:

git config submodule.common.url /data/my_local_common
于 2009-05-29T23:27:19.103 に答える