关于git:”签出”文件夹及其历史记录到新存储库中


“checkout” a folder and its history into a new repository

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Detach subdirectory into separate Git repository

我想我要的是完全不可能的…但值得问的是:)

我有一个存储库,在那里我保存了代码和二进制文件(比如PSD)。文件夹结构如下(非常简化):

  • 吉特项目
    • 设计
    • 代码

我现在想做的是拆分设计和代码…然后我将把设计转移到Dropbox,在Github上继续保存代码。

所以…我的问题是,我可以启动一个新的以代码为根的Git存储库,并保留该文件夹的提交历史记录吗?

注意:我想去掉Designs文件夹的原因之一是我需要节省空间:)设计在这段时间内变得很大…因此我不想升级我的Github付费计划。

谢谢!


Git过滤分支可以保留历史记录并删除其他所有内容。

1
$ git filter-branch --subdirectory-filter CODE

当心这是破坏性的。稍后您可能需要执行以下操作:

1
2
$ git reflog expire --expire=now
$ git gc --prune=now

您将看到存储库大小的显著减少,只有代码的历史记录和删除所有那些不可访问的对象。


为什么不做一个删除DESIGNS并将CODE移动到顶层的更改呢?这样历史将被完整而准确地保存下来。

例如(来自GIT-PROJECT)

1
2
3
4
git rm -r DESIGNS # assumes you've saved DESIGNS somewhere
git mv 'CODE/*' .

git commit -m"Removed DESIGNS, moved code to the top level"

如果您真的想将DESIGNS从存储库的历史中删除,并假设代码始终处于顶层,则可以使用git filter-branch--tree-filter--subdirectory-filter来重写历史,尽管这是一个更复杂的更改。