我想要的是类似于这个问题 https://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository。但是,我希望拆分为单独存储库的目录保留为该存储库中的子目录:
我有这个:
foo/
.git/
bar/
baz/
qux/
我想把它分成两个完全独立的存储库:
foo/
.git/
bar/
baz/
quux/
.git/
qux/ # Note: still a subdirectory
如何在 git 中做到这一点?
我可以使用以下方法这个答案 https://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository/359759#359759是否有某种方法可以将所有新存储库的内容移动到整个历史记录中的子目录中。
您确实可以使用子目录过滤器,然后使用索引过滤器将内容放回到子目录中,但是当您可以单独使用索引过滤器时,为什么还要麻烦呢?
这是手册页中的示例:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
这只是删除一个文件名;您想要做的是删除除给定子目录之外的所有内容。如果你想谨慎一点,你可以明确列出要删除的每个路径,但如果你想全力以赴,你可以这样做:
git filter-branch --index-filter 'git ls-tree -z --name-only --full-tree $GIT_COMMIT | grep -zv "^directory-to-keep$" | xargs -0 git rm --cached -r' -- --all
我希望可能有一种更优雅的方式;如果有人有什么请建议!
关于该命令的一些注释:
- filter-branch 内部将 GIT_COMMIT 设置为当前提交 SHA1
- 我没想到
--full-tree
是必要的,但显然过滤器分支从运行索引过滤器.git-rewrite/t
目录而不是存储库的顶层。
- grep 可能有点矫枉过正,但我不认为这是速度问题。
-
--all
将此应用于所有参考文献;我想你确实想要那个。 (这--
将其与过滤器分支选项分开)
-
-z
and -0
告诉 ls-tree、grep 和 xargs 使用 NUL 终止符来处理文件名中的空格。
编辑,很久以后:托马斯建议了一种删除现在为空的提交的方法,但它现在已经过时了。如果您有旧版本的 git,请查看编辑历史记录,但使用现代 git,您所需要做的就是添加此选项:
--prune-empty
这将删除应用索引过滤器后为空的所有提交。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)