gitサブモジュールのリモートリポジトリを変更するにはどうすればよいですか?


724

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

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


8
注:Git 2.25(2020年第1四半期)には、新しいコマンド ":git submodule set-url [--] <path> <newurl>
VonC

回答:


1010

.gitmodulesファイルを編集してURLを更新し、実行git submodule syncしてスーパープロジェクトと作業コピーにその変更を反映できるようにする必要があります。


22
これは、少なくとも1.7.1または1.7.3では.git / configを更新していないようです。
davidtbernal 2010年

6
これは以前のコミットのサブモジュールURL設定も更新しますか?たとえば、古いコミットをチェックアウトした場合、新しいサブモジュールのURLを指しますか?
maxmelbin 2012

63
git submodule foreach -q git config remote.origin.url「実際の」サブモジュールのURLを確認するために使用
Joel Purra

10
.git/configgit 2.1.0を使用しても更新されませんでした。私は両方を更新しなければならなかった.gitmodulesし、.git/config実行する前に手動でgit submodule sync --recursive私のサブモジュールは、リモート更新されています。
2014

7
これgit submodule update --init --recursive --remoteには、実際にリポジトリを新しいリモートに変更する重要なステップが欠けているようです
Jason Axelson

155

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

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 /ブランチに変更しています


8
これは機能しましたが、リモートに変更をプッシュすることを忘れてはなりませんでした。git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00

5
まあ、それは私にとってひどい混乱を引き起こしました。コマンドは静かにダウンしましたが、実際のサブモジュールリポジトリは、リモートが古いもの(古いURL)であるとまだ認識しています。これらのコマンドは、サブモジュールのリポジトリ内の他のコマンドと一緒に使用する必要がありますか?
Motti Shneor

5
最後のコマンドは少し極端です...サブモジュールが内部にあるサブモジュールがある場合、これによりリモートでサブサブモジュールも更新されます。
Baptiste Wicht

7
Submodをサブモジュールの名前に置き換える必要があることに注意してください!
Shital Shah

133

簡単に言うと、.gitmodulesファイルを編集してから、再同期して更新するだけです。

gitコマンドを介して、または直接、ファイルを編集します。

git config --file=.gitmodules -e

あるいは単に:

vim .gitmodules

次に、再同期して更新します。

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --init私のために働いた、--remoteそれをリモートリポジトリのHEADに関連付けるようです。
Chaim Eliyah

96

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

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

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

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

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

.gitmodulesgit -設定:gitの作業ツリーの最上位ディレクトリにあるファイルは、linkgit -of要件に合致する構文を持つテキストファイルである1
[新規]:
このファイルは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"


このマシンでのみサブモジュールのURLを変更したいと思いました。私はレコードを修正することができる親プロジェクトから.git/config:実行してgit config submodule."$submodule_name".url "$new_url" されても、ここで説明します
joeytwiddle

オプションの二重ダッシュはgit submodule set-url [--] <path> <newurl>何をしますか?
ジャバリング

1
@jeverlingこれらはパラメータからオプションを分離するのに役立ちます:stackoverflow.com/a/1192194/6309を
VonC

1
:古いバージョンのgitとUbuntuユーザのためのアップデートに、このPPAを使用できることに注意してくださいlaunchpad.net/~git-core/+archive/ubuntu/ppaは
starbeamrainbowlabs

69

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

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

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


2
本当にありがとうございました。これは、私がすでに実行した後に私のために働いた唯一のものですgit submodule update。他の回答に従っても、./git/modules/externaldirの内容は変更されないため、更新を試みても、依然として誤ったURLが取得されます。
NtscCobalt 2014

これは少し危険なようで、前のサブモジュールの履歴が保持されているかどうかはわかりません。たとえば、メインリポジトリ(サブモジュールを含むもの)の古いコミットまたはブランチをチェックアウトする場合、接続された古いサブモジュールをプルしてメインのその古いコミットに関連づけられるかどうかはわかりません。
Motti Shneor

いいえ、ほぼ確実にわかりません。最初のステップの後ですべてのステップを再度実行する必要があります。これは、サブモジュールの現在の状態を核にするために私が効果を見つけたものです。これを書いてから状況が変わったかどうかはわかりませんが、:)
ベンハイマーズ2016年

@MottiShneorは確かに前のサブモジュールの履歴を保持する必要がある場合に危険と思われますが、私にはわかりません。私の場合、それが機能した唯一のソリューションです。私が欲しかったのは、基本的に元のサブモジュールを自分のフォークに置き換えることでした
arainone

1
これらの手順に従って、「チェックアウトされたサブモジュールディレクトリ自体を削除する(これが必要かどうか不明)」が必要であることが
わかった

10

.git / configファイルを編集するだけです。例えば; あなたが持っている場合は、「一般的な」サブモジュールを、あなたはスーパーモジュールでこれを行うことができます。

git config submodule.common.url /data/my_local_common

これは、スーパープロジェクトで永続的にではなく、1回限りの使用でURLを変更する場合にのみ最適な方法です。たとえば、ディスク上のローカルコピーからサブモジュールを複製する場合などです。
アンディ

4

git config --file=.gitmodules -e パスを更新できるデフォルトのエディターを開きます

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