13

私は次のgit構造を持っています

- git-repo a
-- subdirectory 2015
--- git-submodule b
-- git-submodule c
--- git-submodule d

gitサブモジュールcをフォルダー2015に移動したいと思います。これを行うための「汚い方法」を知っています(.git/configを変更し、.git/modulesファイル内のいくつかのファイルでgitdirを変更する必要があります)

私は最近、 git mv がこれを実行できるはずだと読みました。

git mv c 2015/

これは、ネストされたサブモジュール (私の場合は d) がないリポジトリでは問題なく機能します。ただし、ディレクトリでこのコマンドを実行すると、次のようなエラーが発生します

fatal: Not a git repository: d/../../.git/modules/c/modules/d
fatal: 'git status --porcelain' failed in submodule 2015/c

(注、このエラーは、上記の移動を実行した後に git ステータスで発生します)

この移動を行うクリーンな方法 (つまり、.git/modules ファイルのパスを手動で変更する必要のない方法) を知っている人はいますか?

編集: (2015 年 6 月 10 日)

git構成ファイルの変更を伴わない私の現在の最良の解決策は(最初に、dへのすべての変更がコミットされ、どこかにプッシュされていることを確認してください)

rm c/d -rf
git mv c 2015
cd 2015/c
git submodule update

編集: (2015 年 8 月 10 日)

さらに邪魔にならない回避策

git mv c 2015
rm 2015/c/d/.git
cd 2015/c
git submodule update

編集:(2018年9月21日)

git バージョン 2.19 以降。これは修正されgit mv、期待どおりに動作します。

4

2 に答える 2

4

https://stackoverflow.com/a/32924692/2274140の@VonC で確認されているように、これは git mv のバグです。

考えられる回避策はいくつかあります。最も簡単な方法は、.git ファイルの複雑な変更を必要としません (質問して以来、私はこれを使用しています)。次のように機能します。

git mv c 2015
rm 2015/c/d/.git
cd 2015/c
git submodule update

サブサブモジュールの .git ファイルを一時的に削除しますd。その後、git サブモジュールの更新により、この .git ファイルが再度修正されます。

gitdir の一時的な削除を回避するその他の回避策については、次の回答を参照してください: https://stackoverflow.com/a/32924692/2274140

于 2016-06-23T09:09:18.713 に答える