gpt4 book ai didi

git - 我如何 git "subtree split"但保持完整的文件夹层次结构?

转载 作者:太空狗 更新时间:2023-10-29 13:10:51 29 4
gpt4 key购买 nike

我一直在尝试将项目子库分离到新的存储库中,但我想分离完整的文件夹路径,而不仅仅是目标文件夹。

当我过滤时,生成的文件夹结构的父级来自目标文件夹而不是存储库根目录(或我指定的祖先),这有效地破坏了包结构,因为类不再正确匹配文件夹:

原始 repo :

+- repo/master
+- lib1
+- lib2
+- lib3
+- ClassA
+- ClassB
+- ClassC

Git 命令:

git subtree split -P lib3 -b new-branch

结果结构:

+- repo/new-branch
+- ClassA
+- ClassB
+- ClassC

要求的结构:

+- repo/new-branch
+- lib3
+- ClassA
+- ClassB
+- ClassC

有什么办法吗?我一直在阅读关于 rebase 以某种方式添加根“核心”文件夹,就好像它在拆分之前就在那里一样,但是我的 git-fu 不够强大,遗憾的是:(

我尝试的另一件事是 filter-branch 来删除其他目录,但我似乎只能删除一个根级文件夹,然后当我尝试其他文件夹时 git 开始提示。

谢谢:)

最佳答案

git subtree split似乎没有提供您想要的选项(但它听起来很有用,所以也许您可以为该项目贡献一个!)

因此,有两种方法可以做到这一点,具体取决于您的需要。

1) 导出单个目录(更简单的选项)

这利用了您想移动到另一个存储库这一事实,因此我们可以提取子树,然后在单独的步骤中重新定位它。

  1. 使用 git subtree split将您想要的文件提取到存储库中的中间分支(您已经完成了此操作)。

     git subtree split -P lib3 -b new-branch
  2. 创建一个新的空存储库:

     git init lib3-repo
    cd lib3-repo
    git commit --allow-empty -m 'Initial commit'
  3. 将中间分支的内容添加为子树:

     git subtree add -P lib3 repo new-branch

这应该再次重写历史并重新插入丢失的目录级别。

每次您想在两个存储库之间交换历史记录时,您都必须通过中间分支(即 subtree split ,然后是 subtree pull ),但它应该可以工作。

2) 导出任意一组文件(更复杂)

要保留多个特定的子树,您需要 git filter-branch .

有很多方法可以选择要保留或丢弃哪些提交和文件,但本节使用 --index-filter选择文件而无需访问文件的内容。

将所有文件保留在“lib3”和“src/core”目录中,而不以任何方式编辑它们的位置。

git co -b new-branch
git filter-branch --index-filter \
'git ls-files \
| grep -v "^lib3/\|^src/core/" \
| xargs --no-run-if-empty git rm --cached' \
HEAD

过滤器代码是一个编辑 Git 索引 的 shell 脚本(记住,我们使用的是 --index-filter)。

git ls-filesls相同除了它在 repo 中列出文件,而不是在工作树中。

grep -v <pattern>给出所有匹配模式的东西,\|在模式中是一个替代方案,所以我们得到要删除的文件列表。

xargs --no-run-if-empty为管道输入中的每个文件名运行一个命令(除非没有任何文件名)。

git rm --cached从索引中删除文件。

这将创建一个分支 ( new-branch),其中包含您想要的过滤文件。您可以使用普通的 pull 命令将它们导入到另一个存储库中:

git init new-repo
cd new-repo

git remote add origin /path/to/old-repo
git pull origin new-branch

关于git - 我如何 git "subtree split"但保持完整的文件夹层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940679/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com