我跟着
中的潜在解决方案Detach (move) subdirectory into separate Git repository
我的要求类似,但只是略有不同希望有人可以提供一些简单的解决方案。
说我有以下回购:
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├ ├──aaa.xyz
├── btoa
├── location
└── navigator
我想要一个新的仓库abcd
,其中包含btoa
和aaa.xyz
的全部内容,同时保留btoa
和aaa.xyz
的历史记录。
任何帮助将受到高度赞赏。
注意:如果我已经有一个名为abcd
的空仓库,那么将btoa
和aaa.xyz
移至abcd
的说明也会有所帮助。
答案 0 :(得分:0)
也许我们有多个解决方案,但我建议这个解决方案: 由于你没有提到分支,我想你只有一个分支。
创建一个名为abcd
,https://example.com/USERNAME/abcd.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
参考
答案 1 :(得分:0)
如果您有漫长的历史或大量的工作树,如果您避免不必要的流失,这将会大大加快。
在你能找到的最快的文件系统上做一个临时ref-surgery repo,这是一个tmpfs(在windows上你要安装一个“RAM磁盘”,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)上花了大约五分钟来完成git历史的所有十年,重写11924次提交,大约占总数的四分之一,这恰好改变了t
ests目录或builtin/var.c
。
(编辑:用实际路径名替换origin
,远程名称是早期版本的保留名称)