有没有一种方法可以提取包含完整历史记录的文件夹?

5
我有一个拥有许多Visual Studio项目的仓库,我想将它们提取到自己的解决方案和仓库中,但我不想失去历史记录。
是否有一种方法可以从当前仓库创建一个具有完整历史记录但仅包含我选择的文件夹的仓库?
我可以克隆仓库并删除我不想要的内容,但我希望节省一些空间。
5个回答

3

这个过程在这里有描述。如果您不需要使用GitHub(或任何其他托管服务),则步骤1至5应该足够。


由于需要保留同级目录,因此“--subdirectory-filter”似乎并不是一个好选择。 - Paulo Morgado
提交哈希值会保持不变吗? - Paulo Morgado
我不确定,但看起来并非如此。请参见这里警告!重写的历史将对所有对象具有不同的对象名称,并且不会与原始分支合并。您将无法轻松地将重写的分支推送和分发到原始分支之上。如果您不知道全部含义,请不要使用此命令,并且在可能的情况下避免使用它,如果一个简单的单个提交就足以解决您的问题。 - kowsky
它确实将仓库更改为我想要的,但会丢失历史记录。有没有办法保留历史记录? - Paulo Morgado
你想要保留整个代码库的历史记录,还是只保留你提取的部分?而且,“保留历史记录”指的是有关更改发生的信息还是原始代码库中的确切提交记录? - kowsky
我想保留我保存的所有文件更改信息。 - Paulo Morgado

1
在磁盘上创建Git仓库文件夹的多个副本(每个要提取的解决方案一个),然后使用BFG Repo-Cleaner删除不属于每个文件夹的所有文件夹,从而在每个仓库上重写历史,只留下您想要的文件(并保留它们的历史记录)。

1

git filter-branch 现在建议使用其他替代方案!(在 git 版本 2.26 中检查)

$ git filter-branch --prune-empty --subdirectory-filter ...
WARNING: git-filter-branch has a glut of gotchas generating mangled history
     rewrites.  Hit Ctrl-C before proceeding to abort, then use an
     alternative filtering tool such as 'git filter-repo'
     (https://github.com/newren/git-filter-repo/) instead.  See the
     filter-branch manual page for more details; to squelch this warning
...

0

除了 @kowsky 的回答,你也可以使用 git-filter-branch 来完成相同的操作,具体如下:

git clone https://github.com/USERNAME/REPOSITORY-NAME
cd REPOSITORY-NAME
git remote rm origin
git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME BRANCH-NAME
git remote set-url origin https://github.com/USERNAME/NEW-REPOSITORY-NAME.git
git push -u origin BRANCH-NAME

我是要删除还是保留 FOLDER-NAME 文件夹? - Paulo Morgado
我也尝试过类似于 git filter-branch --tree-filter 'rm status' HEAD 的东西,但我总是得到 rm: cannot remove 'status': No such file or directory 错误。 - Paulo Morgado
1
FOLDER-NAME 是您想要保留的文件夹名称。 - Arpit Aggarwal
它确实将仓库更改为我想要的,但会丢失历史记录。有没有办法保留历史记录? - Paulo Morgado

0
创建补丁文件。
cd ~/repository/path
git log --pretty=email --patch-with-stat --reverse --full-index --binary -- path/to/file_or_folder > /tmp/patc

如有需要,进行路径替换

sed -i -e 's/deep\/path\/that\/you\/want\/shorter/short\/path/g' /tmp/patch

提交到新的仓库

cd ~/another_repository/path
git am < /tmp/patch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接