我有一个包含多个子目录的git存储库。我现在想要将多个子目录拆分成一个新的存储库。如果您只有一个要提取到新仓库中的子目录,那么git subtree
看起来很容易,但是如何提取多个子目录呢?我没有看到这样做的干净方法。
这是我现在拥有的结构(AlphaDirectory
中的存储库):
AlphaDirectory
AlphaSubDirectory1
AlphaSubDirectory2
BetaSubDirectory1
BetaSubDirectory2
这就是我需要的(AlphaDirectory
和BetaDirectory
中的每个都有一个单独的存储库):
AlphaDirectory
AlphaSubDirectory1
AlphaSubDirectory2
BetaDirectory
BetaSubDirectory1
BetaSubDirectory2
这与此有关 Splitting many subdirectories into a new, separate Git repository及其引用的问题与所有3个提问中的结构不同。
答案 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
然后对于每个分支,您基本上合并每个分支,但它将在原始子目录之外合并。你可以通过创建原始仓库中的子目录,并将其所有文件移回内部,然后提交它来解决这个问题。当然,在移动内容时,您不希望移动.git
和BetaSubDirectory?
目录。
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个)。