作为问题的子集 独立式台词 已经做出了以下事实,即使对分裂和合并GIT存储库的过程有很多问题,我也找不到一个在出现子模型时触及分裂主题的问题。

因此,在以下情况下:

.git/
.gitmodules
folder/
    data/
    content/
        other_data/
        submoduleA/
        submoduleB/

我想获得两个具有以下结构的存储库:

.git/
data/

.git/
.gitmodules
content/
    other_data/
    submoduleA/
    submoduleB/

第一种情况不是问题,可以通过描述的方法轻松解决 独立式台词.

第二个不是那么多。子模型的存在以及.gitModules包含的完整路径 folder/content/submoduleAfolder/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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top