web-dev-qa-db-ja.com

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

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

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

619
Andrew Grimm

URLを更新するために.gitmodulesファイルを編集してから、その変更をスーパープロジェクトと作業コピーに反映させるためにgit submodule syncを実行することができます。

882
Jim Puls

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

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 /同じリポジトリのブランチに変更する

121

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

Gitコマンドまたは直接のどちらかでファイルを編集します。

git config --file=.gitmodules -e

あるいは単に:

vim .gitmodules

その後、再同期して更新します。

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

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

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

すべてをやった後、すべてが私が期待する状態になります。リポジトリの他のユーザが更新するときにも同様の苦痛を感じるだろうと思います - これらのステップをあなたのコミットメッセージで説明するのは賢明でしょう!

64
Ben Hymers

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

だから今 gitmoduleのドキュメント はまだ含まれていません:

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

それはほとんど{ Jim's answer を確認しています。


この git submodule tutorial に従えば、サブモジュールリポジトリのURLを.git/configに追加するには "git submodule init"が必要になるでしょう。

(特にサブモジュールの数が重要である場合) "git submodule sync"に 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"

58
VonC

。git/configファイルを編集するだけです。例えば; "common"サブモジュールがある場合は、スーパーモジュールでこれを実行できます。

git config submodule.common.url /data/my_local_common
9
FelipeC

git config --file=.gitmodules -eはデフォルトのエディタを開き、そこでパスを更新できます。

3
LuGo