将多个子目录分离(移动)到单独的Git存储库

时间:2016-07-13 17:00:18

标签: git github

我有一个包含多个子目录的git存储库。我现在想要将多个子目录拆分成一个新的存储库。如果您只有一个要提取到新仓库中的子目录,那么git subtree看起来很容易,但是如何提取多个子目录呢?我没有看到这样做的干净方法。

这是我现在拥有的结构(AlphaDirectory中的存储库):

AlphaDirectory
    AlphaSubDirectory1
    AlphaSubDirectory2
    BetaSubDirectory1
    BetaSubDirectory2

这就是我需要的(AlphaDirectoryBetaDirectory中的每个都有一个单独的存储库):

AlphaDirectory
    AlphaSubDirectory1
    AlphaSubDirectory2
BetaDirectory
    BetaSubDirectory1
    BetaSubDirectory2

这与此有关 Splitting many subdirectories into a new, separate Git repository及其引用的问题与所有3个提问中的结构不同。

2 个答案:

答案 0 :(得分:2)

这种类型的拆分必须使用git filter-branch

git clone AlphaDirectory BetaDirectory

cd AlphaDirectory
git filter-branch --tree-filter "rm -rf BetaSubDirectory*" --prune-empty -- --all

cd ../BetaDirectory
git filter-branch --tree-filter "rm -rf AlphaSubDirectory*" --prune-empty -- --all

答案 1 :(得分:2)

我假设在新的存储库中,您只想保留与移动的目录相关的历史记录,而不是原始存储库的完整历史记录。我遇到了同样的问题,这对我有用。

首先,在原始存储库中将两个项目的历史记录分成两个新分支(如果您愿意,可以多于两个)。您可能希望在AlphaDirectory的克隆上执行此操作,以便您不会污染原始存储库。

cd AlphaDirectory
git subtree split -P BetaSubDirectory1 -b BetaSubDirectory1Branch
git subtree split -P BetaSubDirectory2 -b BetaSubDirectory2Branch
cd ..

然后,创建新的存储库并将旧存储库添加为远程存储库(git存储库可以有多个远程存储器,这没关系!)。

cd BetaDirectory
git init
git remote add alpharepo ../AlphaDirectory
git fetch alpharepo

然后对于每个分支,您基本上合并每个分支,但它将在原始子目录之外合并。你可以通过创建原始仓库中的子目录,并将其所有文件移回内部,然后提交它来解决这个问题。当然,在移动内容时,您不希望移动.gitBetaSubDirectory?目录。

git merge alpharepo/BetaSubDirectory1Branch
mkdir BetaSubDirectory1
<move stuff from BetaDirectory into BetaSubDirectory1>
git commit -m "merge BetaSubDirectory1"

git merge alpharepo/BetaSubDirectory2Branch
mkdir BetaSubDirectory2
<move stuff from BetaDirectory into BetaSubDirectory2>
git commit -m "merge BetaSubDirectory2"

最后,删除旧遥控器:

git remote remove alpharepo

这也适用于两个以上的子目录(我有15个)。