我们的 Git 存储库最初是一个庞大的 SVN 存储库的一部分,其中每个项目都有自己的树,如下所示:
project1/branches
/tags
/trunk
project2/branches
/tags
/trunk
显然,使用以下命令将文件从一个移动到另一个是非常容易的svn mv
。但在 Git 中,每个项目都在自己的存储库中,今天我被要求从project2
to project1
。我做了这样的事情:
$ git clone project2
$ cd project2
$ git filter-branch --subdirectory-filter deeply/buried/java/source/directory/A -- --all
$ git remote rm origin # so I don't accidentally overwrite the repo ;-)
$ mkdir -p deeply/buried/different/java/source/directory/B
$ for f in *.java; do
> git mv $f deeply/buried/different/java/source/directory/B
> done
$ git commit -m "moved files to new subdirectory"
$ cd ..
$
$ git clone project1
$ cd project1
$ git remote add p2 ../project2
$ git fetch p2
$ git branch p2 remotes/p2/master
$ git merge p2 # --allow-unrelated-histories for git 2.9+
$ git remote rm p2
$ git push
但这似乎相当复杂。一般来说,有更好的方法来做这种事情吗?或者我采取了正确的方法?
请注意,这涉及将历史记录合并到现有存储库中,而不是简单地从另一个存储库的一部分创建一个新的独立存储库(就像之前的问题一样 https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository).
如果您的历史记录正常,您可以将提交作为补丁取出并将其应用到新存储库中:
cd repository
git log \
--pretty=email \
--patch-with-stat \
--reverse \
--full-index \
--binary \
-m \
--first-parent \
-- path/to/file_or_folder \
> patch
cd ../another_repository
git am --committer-date-is-author-date < ../repository/patch
或者在一行中
git log --pretty=email --patch-with-stat --reverse --full-index --binary -m --first-parent -- path/to/file_or_folder | (cd /path/to/new_repository && git am --committer-date-is-author-date)
提示:如果应将源项目子目录中的提交提取到新的存储库根目录,git am
可以给出一个像这样的参数-p2
从补丁中删除额外的目录。
(取自Exherbo 的文档 http://exherbo.org/docs/contributing.html#submitting_patches_for_package_repositories)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)