2012-04-02 115 views
8

我想在我的repo中创建一个新分支,该分支仅包含来自主文件中的特定目录的文件及其历史记录然后推送该分支到一个新的存储库。Git创建一个只包含指定目录及其历史记录的新分支,然后推送到新的存储库

...或者其他等价物 - 例如,可以在不创建分支的情况下将目录推送到新的存储库到新的存储库。

到目前为止,我认为以下方法可行,但我想知道是否有更简化的方法。

1 - 创建一个空的分支:

git symbolic-ref HEAD refs/heads/<new-branch> 
rm .git/index 
git clean -fdx 

2 - 结帐从主目录:

git checkout master <paths> ... 
git add <paths> ... 
git commit 

3 - 推分支到新的远程:

git push -u <remote-URL> <new-branch> 

4 - 然后,在新的回购中,合并分支与主人:

git checkout -t origin/<new-branch> 
git checkout master 
git merge <new-branch> 
git branch -d afterimage 
git branch -d -r afterimage 

我试图做一些相当于Detach subdirectory into separate Git repository,但没有git filter-branch烂摊子。

+3

......但你实际上*需要*使用'git filter-branch'来提取子目录的历史记录。没有这个,你只需要获取文件。 – 2012-04-02 05:44:16

+1

我真的没有看到没有关注你的链接后的兴趣。按照您提出的方式进行操作,但这是蛮力,并且它不会清理您的历史或存储库数据。 – CharlesB 2012-04-02 05:55:08

回答

13

为什么你不想使用git filter-branch?它是专门为诸如你想要的任务而构建的。

git branch subdir_branch HEAD 
git filter-branch --subdirectory-filter dir/to/filter -- subdir_branch 
git push git://.../new_repo.git subdir_branch:master 

这会给你只有在一个新的存储库中的dir/to/filter的内容,包括它的所有历史,仅此而已。由于您只会过滤新创建的分支,因此您的存储库的其余部分将保持不变。之后您可以删除subdir_branch

相关问题