【发布时间】:2010-11-24 19:57:47
【问题描述】:
我们的 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
但这似乎很令人费解。一般来说,有没有更好的方法来做这种事情?还是我采用了正确的方法?
请注意,这涉及将历史合并到现有存储库中,而不是简单地从另一个存储库 (as in an earlier question) 的一部分创建新的独立存储库。
【问题讨论】:
-
这听起来对我来说是一个合理的方法;我想不出任何明显的方法来显着改进您的方法。很高兴 Git 实际上确实使这变得简单(例如,我不想尝试在 Subversion 中的不同存储库之间移动文件目录)。
-
@ebneter - 我已经使用 shell 脚本手动完成了这个(将历史从一个 svn repo 移动到另一个)。基本上,我将特定文件/目录中的历史记录(差异、提交日志消息)重放到第二个存储库中。
-
我想知道你为什么不使用
git fetch p2 && git merge p2而不是git fetch p2 && git branch .. && git merge p2?编辑:好吧,看起来你想在一个名为 p2 的新分支中获取更改,而不是当前分支。 -
有没有办法防止 --filter-branch 破坏目录结构?这个“git mv”步骤会导致大量的文件删除和文件创建。
-
git filter-repo是在 2021 年执行此操作的正确工具,而不是filter-branch。
标签: git repository