我有一个git
信息库,从本质上讲,它包含两个相关的项目,我现在想将其拆分。我想将与一个项目相关的文件移动到新的存储库中,以保留更改的历史记录。具体来说,让我们假设原始的git存储库包含:
file1.c
file2.c
subdir/file2_extra.c
此外,原始git
存储库包含多个分支。我只想保留其中一些,那些与我要分离的文件有关。
如何创建仅包含git
和file2.c
以及提交历史的新subdir/file2_extra.c
存储库?
请注意,我要分离的文件未在单独的目录中找到。否则,我认为可以使用git subtree
。
我尝试使用git filter-branch
,但没有成功。让我们假设原始存储库是git_original
,我尝试过的是
$ git clone git_original/ git_new
Cloning into 'git_new'...
done.
$ cd git_new
$ git rm file1.c
rm 'file1.c'
$ git filter-branch --prune-empty -- --all
Cannot rewrite branches: Your index contains uncommitted changes.
但是,如果我承诺删除file1.c
,那么git filter-branch
不会做任何事情。
答案 0 :(得分:1)
基于this link(感谢@marekful提供此功能),我设计了此解决方案。主要思想是将存储库克隆到一个新的存储库中,并消除每次提交中不需要的文件。我假设有一个远程存储库,每个本地分支都跟踪相应的远程分支。
将旧存储库克隆到新存储库中。
$ git clone git_original/ git_new
进入新的存储库。
$ cd git_new
为新存储库中的每个所需分支 设置一个分支。
$ git branch -t branch_name origin/branch_name
删除新存储库中的所有不需要的文件。例如,在问题示例中,我想删除文件file1.c。
$ git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file1.c' \
--prune-empty -- --all
如果您删除多个文件,则必须使用选项-f
,因为它会强制覆盖“旧”引用。
通过git checkout
到新存储库的所有分支,您可以检查确实删除了不需要的文件。
一些清理。
$ git reflog expire --expire=now --all
$ git gc --prune=now --aggressive
现在,删除旧的来源并与新的远程存储库关联。
$ git remote rm origin
$ git remote add origin remote_origin_address
最后将所有内容推送到新遥控器。
$ git push -u origin --all
$ git push -u origin --tags