Git 创建一个只有指定目录及其历史的新分支,然后推送到新的存储库

标签 git branch git-filter-branch

我想在我的仓库中创建一个新分支,它只包含主目录中特定目录的文件及其历史,然后将该分支推送到新仓库。

...或类似的东西——例如,可以在不创建分支的情况下将目录推送到新的存储库到新的存储库。

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

1 - 创建一个空分支:

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

2 - 从 master check out 一个目录:

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

3 - 将分支推送到新的远程:

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

4 - 然后,在新的 repo 中,将分支与 master merge :

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 困惑。

最佳答案

你为什么不想使用 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

关于Git 创建一个只有指定目录及其历史的新分支,然后推送到新的存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971332/

相关文章:

git - 如何删除 git 中分支的远程符号链接(symbolic link)?

git - 使用 meld 查看分支的差异?

git - 我如何压缩 git 中提交日期不是过去的提交?

git - 删除远程分支原点

mercurial - Capistrano、Mercurial 和分支机构

rubygems - 从 Github 分支安装 Gem?

laravel - 防止 git 在 git pull 时覆盖文件所有者

git - 撤消 "git filter-branch ... -- --all"?在一个命令中?

git - 删除既不在子树中也不在原始存储库中的提交

git - 反复使用 git-filter-branch 重写新提交