将一些文件从git存储库移至新文件

时间:2019-01-11 10:26:24

标签: git

我有一个git信息库,从本质上讲,它包含两个相关的项目,我现在想将其拆分。我想将与一个项目相关的文件移动到新的存储库中,以保留更改的历史记录。具体来说,让我们假设原始的git存储库包含:

file1.c
file2.c
subdir/file2_extra.c

此外,原始git存储库包含多个分支。我只想保留其中一些,那些与我要分离的文件有关。

如何创建仅包含gitfile2.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不会做任何事情。

1 个答案:

答案 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