我有一个包含多个分支的应用程序的git
存储库。源树由几个目录组成。 E.g:
main_folder
|--> .git
|--> dir0
|--> dir1
|--> dir2
不幸的是,从开发开始我就没有使用git-submodules
或git-subtree
。现在我想将其中一个目录(例如dir0
)作为新的独立应用程序移动到新的存储库中。当然,如果可能的话,我想保留相应目录的历史记录和分支。
所以我有两个问题:
答案 0 :(得分:3)
试试git subtree split
。这可以拆分子文件夹并保留历史记录。
请参阅有关如何使用它的手册页。
答案 1 :(得分:2)
使用git splits
它基本上使用相同的git filter-branch
方法,但界面更简单。
git splits
。我基于jkeating's solution将其创建为git扩展。
#change into your repo's directory
cd /path/to/repo
#checkout the branch
git checkout MyOldBranch
#split directory or directories into new branch
git splits -b MyNewBranch dir1 dir2 dir2...
如果您想要的是将其历史记录复制到新MyNewBranch分支的目录,请停止此处(您已完成)。
如果您希望将新分支推送到独立仓库
在某处创建一个空的仓库。我们假设我们在GitHub上创建了一个名为new_repo
的空仓库,其路径为:git@github.com:simpliwp/new_repo.git
推送到新的回购。
#add a new remote origin for the empty repo so we can push to the empty repo on GitHub
git remote add origin_new_repo git@github.com:simpliwp/new_repo.git
#push the branch to the new repo's master branch
git push origin_new_repo new_repo:master
将新创建的远程仓库克隆到新的本地目录中
#change current directory out of the old repo
cd /path/to/where/you/want/the/new/local/repo
#clone the remote repo you just pushed to
git clone git@github.com:simpliwp/new_repo.git
答案 2 :(得分:1)
我使用了Github提到的git filter-branch
方法结束了。
程序如下。
cd
到新目录假设我们要创建一个仅包含dir0
分支master
的新存储库,相应的git
命令应为:
git filter-branch --prune-empty --subdirectory-filter dir0 master
这将删除除dir0
以外的所有其他文件和目录。此外,它将删除与' dir0'无关的提交,这非常方便。
在原始存储库中,只需删除目录dir0
并提交。
答案 3 :(得分:0)
你能做什么!
一个。删除dir1并提交。
湾为dir1创建一个新的存储库
C。将其作为子模块添加到主项目中,它将作为sub-module提供给您。
修改-1 的
给你的用例我会建议子模块是这样做的!您可以使用git log --pretty="%H" dir-1 | xargs -n 1 git format-patch -1
创建在dir-1中对“独立应用程序”进行更改的提交补丁。
现在创建一个新的存储库,其初始存储库为空 - 承诺。您可以使用git clone git://github.com/mudassirazvi/EMPTY_COMMIT
克隆类似的内容,然后按顺序逐个应用修补程序。 (您可以通过提供gitk dir1
或git log --oneline dir1
来查看订单。
现在您的回购已准备就绪,请将其添加为子模块
PS:如果你的提交在同一次提交中没有多个dirs,这是直截了当的。如果任何提交都这样做,那么使用git rebase -i
编辑这些提交,使“dir1”的所有提交都独立。