我遵循了潜在的解决方案
Detach (move) subdirectory into separate Git repository
我的要求是相似的,但只是稍微不同,希望有人能提供一些简单的解决方案。
假设我有以下repo:
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├ ├──aaa.xyz
├── btoa
├── location
└── navigator
我想有一个新的repo abcd
,它包含了btoa
和aaa.xyz
的所有内容,同时保留了btoa
和aaa.xyz
的历史。任何帮助都将受到高度的感谢。
注意:如果我已经有一个名为abcd
的空存储库,那么将btoa
和aaa.xyz
移到abcd
中的说明也会有所帮助。
发布于 2017-01-21 13:49:35
如果你有一个较长的历史或较大的工作树,如果你避免不必要的流失,这将大大加快速度。
在你能找到的最快的文件系统上创建一个抓取ref-surgery存储库,那就是tmpfs (在windows上,你会想要安装一个“内存磁盘”,ImDisk对我来说工作得很好)。
scratch=`mktemp -dt`
git init --template='' $scratch
cd !$
echo /path/to/your/node-browser-compat/.git/objects >.git/objects/info/alternates
做一个随机数检出,然后设置你所有的分支引用:
git checkout $(git commit-tree $(git mktree <&-) <&-)
git fetch /path/to/your/node-browser-compat/ --no-tags +refs/heads/*:refs/heads/*
现在,您可以完全自由地重写您想要的任何内容--如果出现任何错误,只需放弃并使用rm -rf即可。
git filter-branch --index-filter '
git read-tree --empty
git reset -q $GIT_COMMIT atob/aaa.xyz btoa
' -- --all -- atob/aaa.xyz btoa
你可以克隆或推送结果的任何部分到你想要的任何地方。
在一个四年的中端芯片(3570K)上,这花了大约5分钟来完成所有10年的git历史,重写了11924个提交,大约占总数的四分之一,这恰好改变了t
ests目录或builtin/var.c
。
(编辑:用实际路径名替换origin
,远程名称是较早版本的保留名称)
发布于 2017-01-21 09:46:27
也许我们有多个解决方案,但我提出了这个解决方案:既然您没有提到分支,我假设您只有一个分支。
创建一个新的名为abcd
、https://example.com/USERNAME/abcd.git的空Git存储库
将node-browser-compat
克隆到abcd
git clone URL_of_node-browser-compat
git remote set-url origin https://example.com/USERNAME/abcd.git
git push -u origin master
删除不必要的文件夹/文件:
git filter-branch --tree-filter 'rm -rf ArrayBuffer' --prune-empty HEAD
git filter-branch --tree-filter 'rm -rf Audio' --prune-empty HEAD
git filter-branch --tree-filter 'rm -rf Blob' --prune-empty HEAD
git filter-branch --tree-filter 'rm -rf FormData' --prune-empty HEAD
git filter-branch --tree-filter 'rm -rf location' --prune-empty HEAD
git filter-branch --tree-filter 'rm -rf navigator' --prune-empty HEAD
如果目录/文件夹atob
有多个项目aaa.xyz
,让我们以相同方式修剪其他文件夹/文件。然后推送到存储库abcd
git add -A .
git push
参考文献
https://stackoverflow.com/questions/41774264
复制相似问题