简单的方法™
事实证明,这是一种非常普遍和有用的做法,Git的霸主们让它变得非常简单,但你必须有一个新版本的Git(>=1.7.11 May 2012)。有关如何安装最新的Git,请参阅附录。此外,下面的演练中有一个真实世界的示例。
准备旧回购cd<大回购>git子树拆分-P<文件夹名称>-b<新分支名称>
注意:<文件夹名称>不能包含前导或尾随字符。例如,名为subject的文件夹必须作为子项目传递,而不是/子项目/
Windows用户注意:当文件夹深度>1时,<文件夹名称>必须具有*nix样式的文件夹分隔符(/)。例如,名为path1\path2\subject的文件夹必须作为path1/path2/subject传递
创建新回购mkdir~/<new repo>&&cd~/<newrepo>初始化git pull</path/to/big repo><新分支的名称>将新回购链接到GitHub或任何地方git远程添加原点<git@github.com:user/new repo.git>git push-u原始主机如果需要,清理<big repo>内部gitrm-rf<文件夹名称>
注意:这会将所有历史引用保留在存储库中。如果您确实担心提交了密码或需要减小.git文件夹的文件大小,请参阅下面的附录。
演练
这些步骤与上面的步骤相同,但遵循我对存储库的确切步骤,而不是使用<meta-named things>。
下面是我在node中实现JavaScript浏览器模块的项目:
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
我想将一个文件夹btoa拆分成一个单独的Git存储库
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
我现在有了一个新的分支,仅限btoa,它只有btoa的提交,我想创建一个新存储库。
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
接下来,我在GitHub或Bitbucket上创建一个新的repo,并将其添加为源代码
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
快乐的一天!
注意:如果您使用README.md、.gitignore和LICENSE创建了一个repo,则需要首先执行以下操作:
git pull origin master
git push origin master
最后,我想从更大的存储库中删除该文件夹
git rm -rf btoa
附录
macOS上的最新Git
要使用Homebrew获取最新版本的Git:
brew install git
Ubuntu上的最新Git
sudo apt-get update
sudo apt-get install git
git --version
如果这不起作用(你有一个非常旧的Ubuntu版本),请尝试
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
如果仍然不起作用,请尝试
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
谢谢你的评论。
清除您的历史记录
默认情况下,从Git中删除文件并不会真正删除它们,它只是表明它们不再存在。如果您想要实际删除历史引用(即您提交了密码),则需要执行以下操作:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
之后,您可以检查您的文件或文件夹是否不再显示在Git历史记录中
git log -- <name-of-folder> # should show nothing
但是,您不能将删除内容“推送”到GitHub等。如果你尝试了,你会得到一个错误,你必须先得到pull,然后才能得到push,然后你就回到了你的历史中。
因此,如果你想从“源”中删除历史记录-意思是从GitHub、Bitbucket等中删除它-你需要删除回购,并重新推送一个经过修剪的回购副本。但等等-还有更多!-如果你真的担心删除密码或类似的东西,你需要删除备份(见下文)。
使.git变小
前面提到的delete history命令仍然会留下一堆备份文件,因为Git非常友好,可以帮助您避免意外破坏回购。它最终会在几天和几个月内删除孤立的文件,但它会在一段时间内将它们留在那里,以防您意识到您无意中删除了一些您不想删除的文件。
所以,如果你真的想清空垃圾箱以立即减少回购的克隆大小,你必须做所有这些非常奇怪的事情:
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
也就是说,我建议您不要执行这些步骤,除非您知道需要执行这些步骤——以防万一您确实删除了错误的子目录,知道吗?当您推送回购时,备份文件不应该被克隆,它们只会在您的本地副本中。
信用
http://psionides.eu/2010/02/04/sharing-code-between-projects-with-git-subtree/从git中永久删除目录http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/如何从git repo中删除未引用的Blob