首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将文件和文件夹重构为新的git存储库

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

Stack Overflow用户
提问于 2017-01-21 08:02:09
回答 2查看 587关注 0票数 0

我遵循了潜在的解决方案

Detach (move) subdirectory into separate Git repository

我的要求是相似的,但只是稍微不同,希望有人能提供一些简单的解决方案。

假设我有以下repo:

代码语言:javascript
运行
复制
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├    ├──aaa.xyz 
├── btoa
├── location
└── navigator

我想有一个新的repo abcd,它包含了btoaaaa.xyz的所有内容,同时保留了btoaaaa.xyz的历史。任何帮助都将受到高度的感谢。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-21 13:49:35

如果你有一个较长的历史或较大的工作树,如果你避免不必要的流失,这将大大加快速度。

在你能找到的最快的文件系统上创建一个抓取ref-surgery存储库,那就是tmpfs (在windows上,你会想要安装一个“内存磁盘”,ImDisk对我来说工作得很好)。

代码语言:javascript
运行
复制
scratch=`mktemp -dt`
git init --template='' $scratch
cd !$
echo /path/to/your/node-browser-compat/.git/objects >.git/objects/info/alternates

做一个随机数检出,然后设置你所有的分支引用:

代码语言:javascript
运行
复制
git checkout $(git commit-tree $(git mktree <&-) <&-)
git fetch /path/to/your/node-browser-compat/ --no-tags +refs/heads/*:refs/heads/*

现在,您可以完全自由地重写您想要的任何内容--如果出现任何错误,只需放弃并使用rm -rf即可。

代码语言:javascript
运行
复制
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个提交,大约占总数的四分之一,这恰好改变了tests目录或builtin/var.c

(编辑:用实际路径名替换origin,远程名称是较早版本的保留名称)

票数 0
EN

Stack Overflow用户

发布于 2017-01-21 09:46:27

也许我们有多个解决方案,但我提出了这个解决方案:既然您没有提到分支,我假设您只有一个分支。

创建一个新的名为abcdhttps://example.com/USERNAME/abcd.git的空Git存储库

node-browser-compat克隆到abcd

代码语言:javascript
运行
复制
git clone URL_of_node-browser-compat
git remote set-url origin https://example.com/USERNAME/abcd.git
git push -u origin master

删除不必要的文件夹/文件:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
git add -A .
git push

参考文献

https://help.github.com/articles/changing-a-remote-s-url/

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41774264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档