【问题标题】:Detach (move) multiple subdirectories into separate Git repository将多个子目录分离(移动)到单独的 Git 存储库中
【发布时间】:2016-07-13 17:00:18
【问题描述】:

我有一个包含多个子目录的 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 个提问的问题都不同。

【问题讨论】:

  • 您需要 beta 子目录中材料的历史记录吗?您是否考虑过克隆(分叉)存储库,然后从每个单独的存储库中删除不需要的材料?可能有更好的方法来处理它,但蛮力有时也有其优点。

标签: git github


【解决方案1】:

这种拆分必须用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

【讨论】:

    【解决方案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 个)。

    【讨论】:

    • 非常感谢。真的很有帮助。
    猜你喜欢
    • 2022-01-22
    • 2010-09-26
    • 1970-01-01
    • 2010-11-21
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2013-10-06
    相关资源
    最近更新 更多