gitサブモジュールのリモートリポジトリを変更するにはどうすればいいですか?
サブモジュールを含むgitリポジトリを作成しました。サブモジュール自体にそのリモートリポジトリパスを変更するよう指示することはできますが、親リポジトリにサブモジュールのリモートリポジトリパスを変更する方法を指示する方法がわかりません。
サブモジュールを削除するのも簡単ではないので、やや運が悪くて手動で作業をしなければならない場合でも、私は驚かないでしょう。
URLを更新するために.gitmodules
ファイルを編集してから、その変更をスーパープロジェクトと作業コピーに反映させるためにgit submodule sync
を実行することができます。
これらのコマンドは、ローカルリポジトリのファイルを変更せずにコマンドプロンプトで作業を行います。
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 /同じリポジトリのブランチに変更する
簡単に言うと、.gitmodulesファイルを編集してから、再同期して更新するだけです。
Gitコマンドまたは直接のどちらかでファイルを編集します。
git config --file=.gitmodules -e
あるいは単に:
vim .gitmodules
その後、再同期して更新します。
git submodule sync
git submodule update --init --recursive --remote
私にとってうまくいったこと(Windowsの場合、gitバージョン1.8.3.msysgit.0を使用):
- 新しいリポジトリへのパスで.gitmodulesを更新します。
- ".git/config"ファイルから対応する行を削除します
- ".git/modules/external"ディレクトリ内の対応するディレクトリを削除します。
- チェックアウトしたサブモジュールディレクトリ自体を削除します(これが必要かどうかは不明)
git submodule init
とgit submodule update
を実行- チェックアウトされたサブモジュールが正しいコミットになっていることを確認し、ハッシュが異なる可能性があるのでそれをコミットします。
すべてをやった後、すべてが私が期待する状態になります。リポジトリの他のユーザが更新するときにも同様の苦痛を感じるだろうと思います - これらのステップをあなたのコミットメッセージで説明するのは賢明でしょう!
実際には、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"
。git/configファイルを編集するだけです。例えば; "common"サブモジュールがある場合は、スーパーモジュールでこれを実行できます。
git config submodule.common.url /data/my_local_common
git config --file=.gitmodules -e
はデフォルトのエディタを開き、そこでパスを更新できます。