Git子树和多个目录

Bil*_*los 10 git git-subtree

我有一个相当大的git存储库,它有一个我维护库代码的目录.该目录包含许多子目录.

repo
+--- lib
|    +--- A
|    +--- B
...
|    +--- Z
Run Code Online (Sandbox Code Playgroud)

现在让我们假设我想要打开源子目录A,...,M并保持子目录的N,...,Z源代码.我们还假设我想:

  • 保留A,...,M在一个开源存储库中.原因是这些目录A,...,M具有相互依赖性,将它们分成单独的存储库会很困惑.
  • 保持我的封闭源存储库的结构不变.例如,我可以创建子目录lib/publib/pvt,但这将有级联需要改变其他地方引用效应或将需要大量的符号链接(lib/A -> lib/pub/A).
  • 有一个类似于git subtree我可以在我的封闭源代码库或开源代码库中修改代码的解决方案,我可以轻松地同步两个存储库之间的更改.

我已经在stackoverflow和google中搜索了一个解决方案,但似乎没有明显的解决方案.从概念上讲,这是git subtree应该能够做到的事情,但它只适用于单个子目录.

我已经查看了git-subtree脚本,目的是修改它.

https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh

在我看来,如果我要修改,subtree_for_commit()我应该能够说服git subtree split考虑不止一个目录进行拆分.但是我对git的了解还不足以理解脚本正在做什么并在不破坏事情的情况下修改它.

如果您对上述问题或任何其他修改指针有任何解决方案git-subtree,请告诉我.

joh*_*003 5

拆分与父项目中的文件混合的子树

这似乎是一个常见的请求,但是当文件夹像这样混合在一起时,我认为没有一个简单的答案。

我建议将库与其他文件夹混合在一起的一般方法是这样的:

  1. 使用库目录的新根创建一个分支:

    git subtree split -P lib/ -b temp-br
    git checkout temp-br
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后使用某些东西来重写历史记录以删除不属于库的部分。我不是这方面的专家,但我能够进行实验并发现类似的方法可以工作:

    git filter-branch --tag-name-filter cat --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch N O P Q R S T U V W X Y Z' HEAD
    
    Run Code Online (Sandbox Code Playgroud)

    注意:如果连续执行命令,您可能需要删除 filter-branch 所做的备份。

    git update-ref -d refs/original/refs/heads/temp-br
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,只需为库创建一个新的存储库并提取剩下的所有内容:

    cd <new-lib-repo>
    git init
    git pull <original-repo> temp-br
    
    Run Code Online (Sandbox Code Playgroud)