相关疑难解决方法(0)

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

我有一个Git存储库,其中包含许多子目录.现在我发现其中一个子目录与另一个子目录无关,应该分离到一个单独的存储库.

如何在将文件的历史记录保存在子目录中的同时执行此操作?

我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会给我一个完整的树,当检查旧版本等.这可能是可以接受的,但我宁愿能够假装两个存储库没有共享历史记录.

为了说清楚,我有以下结构:

XYZ/
    .git/
    XY1/
    ABC/
    XY2/
Run Code Online (Sandbox Code Playgroud)

但我想这样做:

XYZ/
    .git/
    XY1/
    XY2/
ABC/
    .git/
    ABC/
Run Code Online (Sandbox Code Playgroud)

git git-filter-branch git-subtree

1712
推荐指数
15
解决办法
25万
查看次数

将许多子目录分离到一个新的,单独的Git存储库中

这个问题基于Detach子目录到单独的Git存储库中

我想分离一对,而不是分离一个子目录.例如,我当前的目录树如下所示:

/apps
  /AAA
  /BBB
  /CCC
/libs
  /XXX
  /YYY
  /ZZZ
Run Code Online (Sandbox Code Playgroud)

而我想这样做:

/apps
  /AAA
/libs
  /XXX
Run Code Online (Sandbox Code Playgroud)

--subdirectory-filter参数git filter-branch将无法工作,因为它在第一次运行时除去了给定目录之外的所有内容.我认为使用--index-filter所有不需要的文件的参数会起作用(尽管很乏味),但如果我尝试不止一次运行它,我会得到以下消息:

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?TIA

git git-filter-branch

125
推荐指数
8
解决办法
4万
查看次数

将git仓库中的一组文件拆分到他们自己的存储库中,保留相关历史记录

可能重复:
如何在保留子目录的同时拆分git存储库?

有一次,我将我的代码添加到现有的git repo中,并且已经承诺了很多,因为其他开发人员已经提交到repo中的其他现有文件. 现在我想将我的代码拆分为自己的repo,但保留我的特定文件的所有更改历史记录.

通过阅读其他人为分割代码所做的工作,我正在查看filter-branch和执行--index-filter--tree-filter使用rm命令来查找我不关心的文件.我不想使用,--subdirectory-filter因为它不适合将我的代码保存为topdir的子目录(我们也共享一个子目录).更复杂的是,原始存储库中的一些文件随着时间的推移已经移动了一些,并且有一些文件被创建然后被删除.这使得设计一个rm列表有点......具有挑战性.

我正在寻找一种方法来过滤所有/除了/文件/目录列表.有人知道这样做的方法吗?

git git-filter-branch

36
推荐指数
1
解决办法
8141
查看次数

git filter-branch导致了一个断开连接的历史记录:如何摆脱旧的提交?

方案如下:

我有一个很大的CVS存储库,我想转换为14个不同的git存储库.这个cvs2git过程的一部分很好,并导致一个大的存储库repo.git.

对于14 git repo中的每一个,我克隆主repo并运行以下命令:

git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --subdirectory-filter "sub/directory" -- --all
Run Code Online (Sandbox Code Playgroud)

但是,在此命令之前,我必须git filter-branch为某些git存储库执行另一个命令,因为我必须重写提交以将文件从目录移动到另一个目录.这--tree-filter是我使用的选项.以下是执行命令行的示例:

script_tree_filter="if test -f rep/to/my/file && test -d another/rep ; then echo Moving my file ; mv rep/to/my/file another/rep; fi"
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --tree-filter '$script_tree_filter' -- --all
Run Code Online (Sandbox Code Playgroud)

在过程结束时(14500提交:大约需要1小时!)我清理refs并使用git gc:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

最后,我获得了一个大小为1.2Go的存储库(显然仍然是太大了),通过查看提交,我可以看到很多旧的仍然存在.它们涉及在--subdirectory-filter命令之后不再存在的文件和目录. …

git tree disconnected git-filter-branch

7
推荐指数
1
解决办法
544
查看次数

分裂巨大的git repo

我正在尝试使用此问题中描述的配方拆分git repo ,但是有问题的git repo很大并且有数千个提交,因此当我尝试按照描述运行命令并且提交过滤器失败时命令行限制就会启动.如果我尝试分阶段(首先应用索引过滤器,然后提交过滤器),索引过滤器工作正常,但提交过滤器卡住并开始使用大量内存(3G +),所以我必须杀死它.知道怎么做吗?也许我在这里做错了什么?

对于那些没有阅读其他问题的人来说,任务是将一些目录从一个非常大的git repo拆分成另一个repo,同时保留与这些目录相关的历史记录.

git git-filter-branch

5
推荐指数
1
解决办法
571
查看次数

标签 统计

git ×5

git-filter-branch ×5

disconnected ×1

git-subtree ×1

tree ×1