2015-10-05 32 views
2

我一直在试图将一个项目子库解锁为一个新的回购库,但我想分解完整的文件夹路径,而不仅仅是目标文件夹。如何让“子树拆分”保持完整的文件夹层次?

当我过滤,将得到的文件夹结构从目标文件夹,而不是存储库根为父(或其祖先我指定),其有效地打破如类不再正确地匹配文件夹封装结构:

原始回购:

+- 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 

有没有办法做到这一点?我已经阅读了有关重新绑定以某种方式添加根“核心”文件夹,就好像它在分裂之前那里,但我的git-fu不够强壮,可悲:(

我尝试的另一件事是过滤器,分支删除其他目录,但我只能似乎删除一个根级别的文件夹,然后开始混帐,当我试图别人抱怨。

谢谢:)

+0

是否有任何理由,为什么你不能只是创建'master'的一个新的分支:您可以使用普通的拉命令将其导入到另一个回购?这就是你的图表似乎在说的。 –

+0

我编辑了这个问题以使事情变得更加清晰,但本质上我只想提交该文件夹的提交以创建新的回购。我是否用子树分裂来咆哮错误的树? –

+0

如果你想要一个回购仓库里的一个部分表现得像一个单独的回购仓库,那么我会考虑使用_submodules_,但是这只是我自己。 –

回答

4

git subtree split似乎没有提供一个选项是什么你想(但它听起来很有用,所以也许你可以贡献一个项目!)

所以,有两个w唉2这样做,取决于你想要的。

1)出口的单一目录(简单的选择)

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

  1. 使用git subtree split提取到中间的分支你想要的文件在你的仓库(你已经做到了这一点)。

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

    git init lib3-repo 
    cd lib3-repo 
    
  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 

在滤波代码为一个shell脚本,编辑的Git 指数(我们使用--index-filter,记不清了)。

git ls-filesls相同,只是它列出了回购库中的文件,而不是工作树中的文件。

grep -v <pattern>使一切不匹配的模式,并\|的模式是一种替代,所以我们得到要删除的文件列表。

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

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

这会创建一个分支(new-branch),它具有所需的过滤文件。

git init new-repo 
cd new-repo 

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

是的,像'--root'这样的标志会非常有用!好吧,现在试试... –

+0

好的,谢谢 - 那有点工作... 我现在有所有的文件,并有一个根文件夹“核心”,但整个提交历史记录缺少“核心”文件夹。我想要的是核心总是在那里。这可能吗? –

+0

不,我不相信用'subtree'做到这一点。你必须尝试'git filter-branch'和/或'git fast-export'来做任何导出多个子树的事情。 – ams

相关问题