GitスーパープロジェクトのGitサブモジュールのディレクトリ名を変更したいと思います。
.gitmodules
ファイルに次のエントリがあるとします。
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
.emacs.d/vimpulse
ディレクトリを最初に削除せずに.emacs.d/vendor/vimpulse
ディレクトリに移動して(説明は here および here )、それから再度追加するには何を入力する必要がありますか?.
Gitはサブモジュールタグに完全なパスを本当に必要としますか
[submodule ".emacs.d/vimpulse"]
または、サブプロジェクトの名前だけを保存することもできますか?
[submodule "vimpulse"]
注:コメントで述べたように、この回答は古いバージョンのgitで必要な手順を指します。 Gitはサブモジュールの移動をネイティブでサポートするようになりました。
Git 1.8.5以降、
git mv old/submod new/submod
は期待どおりに動作し、すべての配管を行います。サブモジュールの移動の修正が含まれているため、git 1.9.3以降を使用することをお勧めします。
サブモジュールを削除する方法と似ています( サブモジュールを削除するにはどうすればよいですか? を参照)。
.gitmodules
を編集し、サブモジュールのパスを適切に変更し、git add .gitmodules
でインデックスに配置します。mkdir -p new/parent
)を作成します。mv -vi old/parent/submodule new/parent/submodule
)に移動します。git add new/parent
)を追跡していることを確認してください。git rm --cached old/parent/submodule
を使用して古いディレクトリを削除します。.git/modules/old/parent/submodule
をそのすべてのコンテンツとともに.git/modules/new/parent/submodule
に移動します。.git/modules/new/parent/config
ファイルを編集し、ワークツリーアイテムが新しい場所を指していることを確認します。この例では、worktree = ../../../../../new/parent/module
になります。通常、その場所の直接パスには、さらに2つの..
ディレクトリが必要です。ファイルnew/parent/module/.git
を編集し、その中のパスがメインプロジェクト.git
フォルダー内の正しい新しい場所を指していることを確認してください。この例ではgitdir: ../../../.git/modules/new/parent/submodule
です。
git status
の出力は、後で私にとって次のようになります。
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: .gitmodules
# renamed: old/parent/submodule -> new/parent/submodule
#
最後に、変更をコミットします。
上記のValloricのコメントから取られた最も現代的な答え:
git mv old/submod new/submod
git status
で確認できます)。git commit
を使用して変更をコミットすると、準備完了です!できた!
私の場合、サブモジュールをあるディレクトリからサブディレクトリに移動したかったのです。 「AFNetworking」->「ext/AFNetworking」。これらは私が従った手順です:
[core] worktree
行を修正します。鉱山が../../../AFNetworking
から../../../../ext/AFNetworking
に変更されましたgitdir
を修正します。鉱山が../.git/modules/AFNetworking
から../../git/modules/ext/AFNetworking
に変更されましたgit add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
最後に、gitステータスで見ました:
matt$ git status
# On branch ios-master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: .gitmodules
# renamed: AFNetworking -> ext/AFNetworking
出来上がり。上記の例では、ディレクトリの深さは変更されません。これにより、タスクの複雑さが大きく変わり、サブモジュールの名前は変更されません(実際には必要ではないかもしれませんが、そのパスに新しいモジュールを追加した場合に発生します。)
[更新:2014-11-26] Yar は以下をうまく要約しているので、何かをする前に、サブモジュール。不明な場合は、 .git/.gitmodules
を開いてキーを調べます submodule.<name>.url
。
私のために働いたのは、 古いサブモジュールを削除するgit submodule deinit <submodule>
に続いてgit rm <submodule-folder>
を使用することでした。次に、新しいフォルダー名でサブモジュールを再度追加し、コミットします。コミットする前にgitステータスを確認すると、古いサブモジュールが新しい名前に変更され、.gitmoduleが変更されたことが示されます。
$ git submodule deinit foo
$ git rm foo
$ git submodule add https://bar.com/foo.git new-foo
$ git status
renamed: foo -> new-foo
modified: .gitmodules
$ git commit -am "rename foo submodule to new-foo"
トリックは、サブモジュールの.git
ディレクトリが.git/modules
の下のマスターリポジトリに保持され、各サブモジュールがそれを指す.git
ファイルを持っていることを理解しているようです。これが今必要な手順です:
.git
ファイルを編集し、そこに含まれるパスを変更して、マスターリポジトリの.git/modules
ディレクトリ内の正しいディレクトリを指すようにします。.git/modules
ディレクトリを入力し、サブモジュールに対応するディレクトリを見つけます。config
ファイルを編集し、worktree
パスを更新して、サブモジュールの作業ディレクトリの新しい場所を指すようにします。.gitmodules
ファイルを編集し、サブモジュールの作業ディレクトリへのパスを更新します。git add -u
git add <parent-of-new-submodule-directory>
(サブモジュールディレクトリ自体ではなく、親を追加することが重要です。)いくつかのメモ:
[submodule "submodule-name"]
と.gitmodules
の.git/config
行は互いに一致する必要がありますが、他の行とは一致しません。.git
ディレクトリは、互いに正しくポイントする必要があります。.gitmodules
および.git/config
ファイルは同期する必要があります。標準のコマンドを使用して、新しいサブモジュールを追加し、古いサブモジュールを削除することができます。 (.git内の偶発的なエラーを防止する必要があります)
設定例:
mkdir foo; cd foo; git init;
echo "readme" > README.md; git add README.md; git commit -m "First"
## add submodule
git submodule add git://github.com/jquery/jquery.git
git commit -m "Added jquery"
## </setup example>
「jquery」を「vendor/jquery/jquery」に移動する例:
oldPath="jquery"
newPath="vendor/jquery/jquery"
orginUrl=`git config --local --get submodule.${oldPath}.url`
## add new submodule
mkdir -p `dirname "${newPath}"`
git submodule add -- "${orginUrl}" "${newPath}"
## remove old submodule
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}" ## remove old src
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (Housekeeping)
## commit
git add .gitmodules
git commit -m "Renamed ${oldPath} to ${newPath}"
大きなサブモジュールのボーナス方法:
サブモジュールが大きく、クローンを待たない場合は、Originとして古いを使用して新しいサブモジュールを作成し、Originを切り替えることができます。
例(同じセットアップ例を使用)
oldPath="jquery"
newPath="vendor/jquery/jquery"
baseDir=`pwd`
orginUrl=`git config --local --get submodule.${oldPath}.url`
# add new submodule using old submodule as Origin
mkdir -p `dirname "${newPath}"`
git submodule add -- "file://${baseDir}/${oldPath}" "${newPath}"
## change Origin back to original
git config -f .gitmodules submodule."${newPath}".url "${orginUrl}"
git submodule sync -- "${newPath}"
## remove old submodule
...
「[サブモジュール」の後の引用符で囲まれた文字列は重要ではありません。必要に応じて「foobar」に変更できます。 「.git/config」で一致するエントリを見つけるために使用されます。
したがって、「git submodule init」を実行する前に変更を加えた場合、正常に機能します。変更を加える(またはマージによって変更を取得する)場合は、手動で.git/configを編集するか、「git submodule init」を再度実行する必要があります。後者を行うと、.git/configに古い名前の無害な「孤立した」エントリが残ります。
昨日、この試練を経て、 この答え は完璧に機能しました。明確にするために、ここに私の手順を示します。
more .gitmodules
を使用しますdeinit
、rm
、submodule add
を使用できます例
コマンド
git submodule deinit Classes/lib/mustIReally
git rm foo
git submodule add http://developer.audiob.us/download/SDK.git lib/AudioBus
# do your normal commit and Push
git commit -a
注:git mvはこれを行いません。まったく。
シェルスクリプト git-submodule-move を使用するだけです。
与えられた解決策は私にとってはうまくいきませんでしたが、同様のバージョンはうまくいきました...
これは複製されたリポジトリを使用しているため、サブモジュールgitリポジトリは最上位リポジトリ.git dirに含まれています。すべてのカチオンは、トップリポジトリからのものです。
.gitmodulesを編集し、問題のサブモジュールの「path =」設定を変更します。 (ラベルを変更したり、このファイルをインデックスに追加したりする必要はありません。)
.git/modules/name/configを編集し、問題のサブモジュールの "worktree ="設定を変更します
実行:
mv submodule newpath/submodule
git add -u
git add newpath/submodule
リポジトリがアトミックまたは相対サブモジュールである場合、違いがあるのかどうか疑問に思います(私の場合、サブモジュール/.gitはtopproject/.git/modules/submoduleに戻る参照です)