题
作为问题的子集 独立式台词 已经做出了以下事实,即使对分裂和合并GIT存储库的过程有很多问题,我也找不到一个在出现子模型时触及分裂主题的问题。
因此,在以下情况下:
.git/
.gitmodules
folder/
data/
content/
other_data/
submoduleA/
submoduleB/
我想获得两个具有以下结构的存储库:
.git/
data/
和
.git/
.gitmodules
content/
other_data/
submoduleA/
submoduleB/
第一种情况不是问题,可以通过描述的方法轻松解决 独立式台词.
第二个不是那么多。子模型的存在以及.gitModules包含的完整路径 folder/content/submoduleA
和 folder/content/submoduleB
由于.gitModules是指不存在的目录结构(一旦使用过滤器分支),因此导致部分历史的原因是不一致的。
因此,我想知道是否有办法可以这样做,而不会导致不一致的历史。
解决方案
我怀疑(未测试)一秒钟 git filter-branch
将有机会修改 .gitmodules
新存储库的每个提交的内容。
但实际上是一个 git submodule split
司令部在2009年初的讨论中.
建议用法:
git submodule split [--url submodule_repo_url] submodule_dir \
[alternate_dir...]
代替
submodule_dir
带有新创建的子模块,保留所有历史的历史submodule_dir
.
此命令还将每个提交的每个提交都在当前存储库的历史记录中重写,以包括正确的修订sumodule_dir
和适当的.gitmodules
条目。
但是,我在 最新的烹饪.
建议的补丁中的脚本可以使您了解更新的树的重写类型 .gitmodules
档案。
其他提示
我遇到了与unode完全相同的问题,并通过以下过程设法解决了它:
git clone git@github.com:kdeldycke/kev-code.git
cd kev-code
git filter-branch --tree-filter "test -f ./.gitmodules && mv ./.gitmodules ./cool-cavemen/gitmodules || echo 'No .gitmodules file found'" -- --all
git filter-branch --force --prune-empty --subdirectory-filter cool-cavemen --tag-name-filter cat -- --all init..HEAD
git filter-branch --force --tree-filter "test -f ./gitmodules && mv ./gitmodules ./.gitmodules || echo 'No gitmodules file found'" -- --all
git filter-branch --force --tree-filter "test -f ./.gitmodules && sed -i 's/cool-cavemen\///g' ./.gitmodules || echo 'No .gitmodules file found'" -- --all
git remote rm origin
rm -rf .git/refs/original/
git reflog expire --all
git gc --aggressive --prune
git remote add origin git@github.com:kdeldycke/cool-cavemen.git
git push -u origin master --force --tags
如您所见,诀窍是暂时重命名 .gitmodules
文件和使用 sed
重写其内容。您可以获取所有细节和 我博客上此过程的上下文.
详细说明凯文的回答:假设外面没有s子模型 cool/cavemen
- 已分离的文件夹(否则将需要更精细的.gitModules来删除这些额外的部分),可以实现这一点 很多 更快地使用一个步骤 index-filter
:
$ git filter-branch --subdirectory-filter cool/cavemen --index-filter $'
hash=$(git rev-parse --verify $GIT_COMMIT:.gitmodules 2>/dev/null) &&
git update-index --add --cacheinfo 100644 $(git cat-file -p $hash |
sed \'s/cool\\/cavemen\\///g\' | git hash-object -w --stdin) .gitmodules ||
true' --tag-name-filter cat --prune-empty -- --all
作为额外的好处,如果 cool/cavemen
每次修订或分支中都不存在那些包含的修订或分支机构 cool/cavemen
将被查看。
如果是这种情况,您可能需要运行以下内容以删除未改变的参考:
$ git for-each-ref --format='%(refname)' |
grep -vF "$(git for-each-ref --format='%(refname)' refs/original |
sed 's/refs\/original\///g')" | xargs -n 1 git update-ref -d