更新 2018 年第二季度和 Git 2.18:
移动一个本身包含子模块的子模块,“ git mv
”忘记对嵌套的子子模块进行必要的调整;
现在代码路径学会了递归到子模块中。
请参阅Jonathan Tan ( ) 的提交 6856077(2018 年 3 月 28 日)。
请参阅Stefan Beller ( )的提交 da62f78、提交 0c89fdd、提交 3b8fb39、提交 f793b89、提交 61aad92(2018 年 3 月 28 日) 。(由Junio C Hamano 合并 -- --在0c7ecb7 提交中,2018 年 5 月 8 日)jhowtan
stefanbeller
gitster
子模块:移动子模块后修复嵌套的子模块
由于子模块本身可以有嵌套的子模块,我们还希望在被要求时修复嵌套的子模块。添加一个选项以递归到嵌套的子模块并连接它们。
由于子模块在内部由它们的名称(这决定了它们的 git 目录相对于它们的超级项目的 git 目录)以及它们在超级项目的工作树中的路径来标识,因此我们需要确保 的映射name <-> path
保持不变。我们可以在git-mv
命令中通过先写出.gitmodules
文件然后强制重新加载子模块配置机制来做到这一点。
2017 年第四季度更新:
最新的 Git 2.14.x/2.15(2017 年第四季度)记录了该错误
请参阅Heiko Voigt ( )的提交 c514167(2017 年 9 月 15 日) 。(由Junio C Hamano 合并 -- --在提交 450b908中,2017 年 9 月 25 日)hvoigt
gitster
当git-mv
与子模块一起使用时,它会检测到并更新其配置(.gitmodules
、工作树和 gitfile)的路径。
这不适用于用户重命名根子模块的递归子模块。
原始答案 2015
我刚刚使用 git 2.6.0(在 Windows 上)对其进行了测试,并且使用自己的嵌套子模块移动子模块似乎有问题:
C:\Users\vonc\prog\git\tests\submove>git clone --recursive a a1
Cloning into 'a1'...
done.
Submodule '2015/b' (C:/Users/vonc/prog/git/tests/submove/b) registered for path '2015/b'
Submodule 'c' (C:/Users/vonc/prog/git/tests/submove/c) registered for path 'c'
Cloning into '2015/b'...
done.
Submodule path '2015/b': checked out 'dc18955ec7b9ad0c04245968e2474646e4d593b2'
Cloning into 'c'...
done.
Submodule path 'c': checked out 'fb4722eaca17ac171b7a2c8c5a1ac1e697f0ee85'
Submodule 'd' (C:/Users/vonc/prog/git/tests/submove/d) registered for path 'd'
Cloning into 'd'...
done.
Submodule path 'c/d': checked out '73cd7b8ff82519720b2fcca18df5ed00dd618b71'
我有:
a1
c
d
2015
b
如果我尝试c
在 2015 子文件夹中移动子模块:
C:\Users\vonc\prog\git\tests\submove\a1>git mv c 2015/c
C:\Users\vonc\prog\git\tests\submove\a1>git status
fatal: Not a git repository: d/../../.git/modules/c/modules/d
fatal: 'git status --porcelain' failed in submodule 2015/c
我发现我需要修改嵌套模块中的两件事d
:
1/手动修改.git/modules/c/modules/d/config
注入正确的路径:
git config -f .git/modules/c/modules/d/config core.worktree ../../../../../2015/c/d
^^^^
2/修改d
工作树:
git config -f .git/modules/c/modules/d/config core.worktree ../../../../../2015/c/d
从那里开始, agit status
有效,但我喜欢(可以肯定)添加 a git submodule sync --recursive
:
C:\Users\vonc\prog\git\tests\submove\a1>git submodule sync --recursive
Synchronizing submodule url for '2015/b'
Synchronizing submodule url for '2015/c'
Synchronizing submodule url for '2015/c/d'
git status
确实显示了预期的结果:
C:\Users\vonc\prog\git\tests\submove\a1>git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: .gitmodules
renamed: c -> 2015/c
我添加并提交该更改:
C:\Users\vonc\prog\git\tests\submove\a1>git add .
C:\Users\vonc\prog\git\tests\submove\a1>git commit -m "move sub c in 2015/c"
[master 8289632] move sub c in 2015/c
2 files changed, 1 insertion(+), 1 deletion(-)
rename c => 2015/c (100%)
C:\Users\vonc\prog\git\tests\submove\a1>gl
* 8289632 - (HEAD -> master) move sub c in 2015/c (3 seconds ago) <VonC>
* 7ebb8e0 - (origin/master, origin/HEAD) a with sub c (38 minutes ago) <VonC>
我现在克隆该存储库以检查移动是否确实已正确注册:
C:\Users\vonc\prog\git\tests\submove>git clone --recursive a1 a2
Cloning into 'a2'...
done.
Submodule '2015/b' (C:/Users/vonc/prog/git/tests/submove/b) registered for path '2015/b'
Submodule 'c' (C:/Users/vonc/prog/git/tests/submove/c) registered for path '2015/c'
Cloning into '2015/b'...
done.
Submodule path '2015/b': checked out 'dc18955ec7b9ad0c04245968e2474646e4d593b2'
Cloning into '2015/c'...
done.
Submodule path '2015/c': checked out 'fb4722eaca17ac171b7a2c8c5a1ac1e697f0ee85'
Submodule 'd' (C:/Users/vonc/prog/git/tests/submove/d) registered for path 'd'
Cloning into 'd'...
done.
Submodule path '2015/c/d': checked out '73cd7b8ff82519720b2fcca18df5ed00dd618b71'
如您所见,c
并且c/d
位于预期的2015/
子文件夹中:
C:\Users\vonc\prog\git\tests\submove>cd a2
C:\Users\vonc\prog\git\tests\submove\a2>dir 2015\c
Directory of C:\Users\vonc\prog\git\tests\submove\a2\2015\c
03/10/2015 18:10 <DIR> .
03/10/2015 18:10 <DIR> ..
03/10/2015 18:10 29 .git
03/10/2015 18:10 40 .gitmodules
03/10/2015 18:10 <DIR> d
2 File(s) 69 bytes
3 Dir(s) 23 656 910 848 bytes free
C:\Users\vonc\prog\git\tests\submove\a2>dir 2015\c\d
Directory of C:\Users\vonc\prog\git\tests\submove\a2\2015\c\d
03/10/2015 18:10 <DIR> .
03/10/2015 18:10 <DIR> ..
03/10/2015 18:10 42 .git
03/10/2015 18:10 3 d.txt
2 File(s) 45 bytes
2 Dir(s) 23 656 910 848 bytes free