如何拆分一个git仓库?

11 浏览
0 Comments

如何拆分一个git仓库?

我有一个包含多个子目录的Git仓库。现在我发现其中一个子目录与其他目录无关,应该分离成一个独立的仓库。\n如何在保留子目录内文件的历史的同时进行操作?\n我猜我可以克隆一份并删除每个克隆的不需要的部分,但是我猜当检出旧版本时,这样做会给我完整的树。这可能是可以接受的,但我更希望能够假装这两个仓库没有共享的历史。\n为了明确起见,我有以下结构:\n

XYZ/
    .git/
    XY1/
    ABC/
    XY2/

\n但我想要的是:\nXYZ/\n .git/\n XY1/\n XY2/\nABC/\n .git/\n ABC/\n

0
0 Comments

如何拆分一个Git仓库?

有时候我们可能需要将一个Git仓库拆分成两个独立的仓库。下面是一个关于如何进行拆分的问题和解决方法。

问题出现的原因:

Paul的回答创建了一个包含/ABC的新仓库,但并没有从/XYZ中移除/ABC。这个问题的解决方法如下:

解决方法:

使用以下命令可以从/XYZ中移除/ABC:

git filter-branch --tree-filter "rm -rf ABC" --prune-empty HEAD

当然,在一个'clone --no-hardlinks'的仓库中先进行测试,并按照Paul列出的重置(reset)、垃圾回收(gc)和修剪(prune)命令进行操作。

将命令修改为git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD,会快得多。index-filter在索引(index)上操作,而tree-filter需要为每个提交(checkout)和暂存(stage)所有文件

在某些情况下,破坏仓库XYZ的历史记录可能是过度的... 对于大多数人来说,简单的"rm -rf ABC; git rm -r ABC; git commit -m'extracted ABC into its own repo'"可能更好。

如果你在多次操作后仍然需要移除两个目录,则可能需要在该命令上使用-f (force)选项,否则会出现"Cannot create a new backup."的错误提示。

如果你使用--index-filter方法,你可能还想将命令修改为git rm -q -r -f,这样每次调用时都不会为删除的每个文件打印一行信息。

我建议编辑Paul的回答,因为Paul的回答非常全面。

0
0 Comments

如何分割一个git仓库?

有时候我们可能需要将一个git仓库拆分成多个仓库,每个仓库只包含特定的子目录。这种情况可能出现在我们希望将一个大型仓库拆分成多个更小的独立仓库,或者我们需要将某个子目录提取出来放到一个新的仓库中。为了解决这个问题,我们可以使用以下步骤:

1. 克隆原始仓库到一个新的目录:

git clone /XYZ /ABC

2. 为了保留我们需要重写的有趣分支,我们需要先将它们设为本地分支,并删除远程origin,这样就不会将提交推送到远程仓库并且可以确保旧的提交不会被引用:

cd /ABC
for i in branch1 br2 br3; do git branch -t $i origin/$i; done
git remote rm origin

或者对于所有远程分支:

cd /ABC
for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done
git remote rm origin

3. 如果你想要删除与子项目无关的标签,你可以稍后再做,但是你可能需要再次清理你的仓库。如果你不这样做,你可能会收到警告信息,如WARNING: Ref 'refs/tags/v0.1' is unchanged(因为所有的标签都与子项目无关),此外,删除这些标签后将会回收更多的空间。如果你想删除所有的标签,可以使用git tag -l | xargs git tag -d命令。

4. 然后使用filter-branch命令来排除其他文件,以便它们可以被清除。我们还可以添加--tag-name-filter cat --prune-empty选项来删除空提交并重写标签(注意这将需要去除标签的签名):

git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all

或者,如果只想重写HEAD分支并忽略标签和其他分支:

git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD

5. 然后删除备份的引用日志,这样空间就可以真正回收(尽管此时操作是破坏性的):

git reset --hard

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

git reflog expire --expire=now --all

git gc --aggressive --prune=now

现在,你就有了一个仅包含ABC子目录并且保留了所有历史记录的本地git仓库。

需要注意的是,对于大多数情况,git filter-branch确实需要添加-- --all参数。是的,真的是--空格-- all。这必须是命令中的最后一个参数。这样做可以保留在新仓库中的项目分支和标签。

上述步骤可以帮助我们将一个git仓库拆分成多个仓库,每个仓库只包含我们需要的子目录。这对于管理大型仓库或提取特定子目录非常有用。我们可以使用git filter-branch命令来重写历史并且只保留我们需要的内容。

0
0 Comments

如何拆分Git仓库?

这个问题的出现原因是为了实现将一个大型Git仓库拆分成多个小仓库的需求。下面是解决这个问题的方法:

首先,需要确保使用的Git版本是1.7.11或更高版本。如果需要安装最新的Git版本,请参考附录中的说明。

准备旧的仓库:

cd 
git subtree split -P  -b 

创建新的仓库:

mkdir ~/ && cd ~/
git init
git pull  

将新的仓库与GitHub或其他地方关联:

git remote add origin 
git push -u origin master

如果需要,在旧的仓库中进行清理:

git rm -rf 

需要注意的是,这个方法会保留仓库的所有历史记录。如果需要删除仓库中的敏感信息或者减小.git文件夹的大小,请参考附录中的方法。

附录中还提到了一些其他相关的信息和参考资料。

这就是如何拆分Git仓库的方法。希望对你有帮助!

0