我们的Git仓库最初是单个巨大的SVN仓库的一部分,其中每个项目都有自己的树形结构,如下所示:
project1/branches
/tags
/trunk
project2/branches
/tags
/trunk
显然,使用svn mv
很容易将文件从一个位置移动到另一个位置。但是在Git中,每个项目都在自己的存储库中,今天我被要求将project2
的子目录移动到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
但这似乎相当复杂。一般情况下有更好的方法来做这样的事情吗?或者我采取了正确的方法吗?
请注意,这涉及将历史记录合并到现有存储库中,而不是仅从另一个存储库的一部分创建新的独立存储库(如在早期的问题中)。
git fetch p2 && git merge p2
而是用git fetch p2 && git branch .. && git merge p2
?编辑:好的,看起来你想在一个名为p2的新分支中获取更改,而不是当前分支。 - Lekensteyngit filter-repo
是进行此操作的正确工具,而非filter-branch
。 - Ed Randall