サブモジュールを含む git リポジトリを作成しました。サブモジュール自体にリモート リポジトリ パスを変更するように指示することはできますが、サブモジュールのリモート リポジトリ パスを変更する方法を親リポジトリに指示する方法がわかりません。
サブモジュールを削除することさえ簡単ではないので、運が悪くて手動でやらなければならない場合でも驚かないでしょう。
サブモジュールを含む git リポジトリを作成しました。サブモジュール自体にリモート リポジトリ パスを変更するように指示することはできますが、サブモジュールのリモート リポジトリ パスを変更する方法を親リポジトリに指示する方法がわかりません。
サブモジュールを削除することさえ簡単ではないので、運が悪くて手動でやらなければならない場合でも驚かないでしょう。
ファイルを編集し.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
これらのコマンドは、ローカル リポジトリのファイルを変更することなく、コマンド プロンプトで作業を行います。
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/ブランチに変更する
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"
私にとってうまくいったこと(Windowsでは、gitバージョン1.8.3.msysgit.0を使用):
git submodule init
してgit submodule update
それをすべて行った後、すべてが私が期待する状態にあります。リポジトリの他のユーザーが更新するときに同様の痛みを感じると思いますが、コミットメッセージでこれらの手順を説明することをお勧めします!
.git/configファイルを編集するだけです。例えば; 「共通」サブモジュールがある場合は、スーパーモジュールでこれを行うことができます:
git config submodule.common.url /data/my_local_common