将文件和文件夹重构为新的git存储库

时间:2017-01-21 00:02:09

标签: git github

我跟着

中的潜在解决方案

Detach (move) subdirectory into separate Git repository

我的要求类似,但只是略有不同希望有人可以提供一些简单的解决方案。

说我有以下回购:

node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├    ├──aaa.xyz 
├── btoa
├── location
└── navigator

我想要一个新的仓库abcd,其中包含btoaaaa.xyz的全部内容,同时保留btoaaaa.xyz的历史记录。 任何帮助将受到高度赞赏。

注意:如果我已经有一个名为abcd的空仓库,那么将btoaaaa.xyz移至abcd的说明也会有所帮助。

2 个答案:

答案 0 :(得分:0)

也许我们有多个解决方案,但我建议这个解决方案: 由于你没有提到分支,我想你只有一个分支。

创建一个名为abcdhttps://example.com/USERNAME/abcd.git

的新空Git存储库

克隆node-browser-compatabcd

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://help.github.com/articles/changing-a-remote-s-url/

https://git-scm.com/docs/git-filter-branch

答案 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,远程名称是早期版本的保留名称)

相关问题