简单易行™
事实证明,这是一种常见且有用的做法,Git的主宰们使其变得非常简单(在1.7.11版本中添加-2012年5月)。此外,在下面的演示中还有一个真实世界的例子。
准备旧的仓库
cd
git subtree split -P -b
注意: 不能包含前导或尾随字符。例如,名为 subproject 的文件夹必须传递为 subproject,而不是 ./subproject/
注意: 是您将在现有/旧仓库中创建的分支,而不是之后的新仓库。
Windows 用户注意:当您的文件夹深度大于 1 时, 必须具有 *nix 风格的文件夹分隔符 (/)。例如,名为 path1\path2\subproject 的文件夹必须传递为 path1/path2/subproject
创建新的仓库
mkdir ~/new-repo && cd ~/new-repo
git init
git pull
将新仓库链接到 GitHub 或其他地方
git remote add origin git@github.com:user/new-repo.git
git push -u origin master
在 中进行清理,如果需要
git rm -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-only,它只包含
btoa的提交记录,我想创建一个新的代码库。
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
接下来,我在GitHub或Bitbucket上创建一个新的仓库,然后将其添加为
origin
。
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
快乐的一天!
注意:如果您创建了一个带有README.md、.gitignore和LICENSE的仓库,您需要先进行拉取操作。
git pull origin master
git push origin master
最后,我想从较大的仓库中删除该文件夹。
git rm -rf btoa
清除浏览历史
默认情况下,从Git中删除文件并不会真正删除它们,只是提交了它们不再存在的事实。如果你想真正删除历史引用(比如你提交了一个密码),你需要执行以下操作:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
之后,您可以检查您的文件或文件夹在Git历史记录中是否完全消失:
git log -- <name-of-folder> # should show nothing
然而,你不能“推送”删除到GitHub等平台。如果你尝试这样做,会出现错误,你必须在执行git push之前执行git pull,然后你又回到了历史记录的状态。
所以,如果你想从“origin”中删除历史记录,也就是从GitHub、Bitbucket等平台中删除它,你需要删除仓库并重新推送一个修剪过的仓库副本。但是等等,还有更多!如果你真的担心删除密码或类似的东西,你需要修剪备份(见下文)。
使.git文件更小
上述删除历史记录的命令仍然会留下一堆备份文件,因为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
说实话,我建议你不要执行这些步骤,除非你确定需要这样做,以防万一你剪切了错误的子目录,你懂的吧?备份文件在推送仓库时不会被克隆,它们只会存在于你的本地副本中。
致谢
git filter-branch
进行此操作已经很容易了,请参见下面的答案。 - jeremyjjbrowngit filter-branch
。请参见文档中的警告。 - djvg