我们有两个并行发展的存储库:一个用于我们项目的代码,一个用于该项目的测试。我想将这两个存储库 merge 到一个存储库中,这样当我回顾历史时,我仍然拥有两个目录结构。
假设我们当前的结构如下,其中project
和 tests
是两个独立的 git 存储库:
project
/src
/include
tests
/short
/long
我想最终得到一个包含两个目录的 git 存储库
project
和
tests
.
我不能使用 this answer 中描述的技术简单地 merge 这两个存储库。 , this one , 或 this site :它们导致存储库在 merge 之前具有两个不同的历史记录,并且在 checkout 过去的提交时,您要么有
src
和
include
, 或
short
和
long
,但你没有他们当时出现的所有四个。
如果我 checkout 在
project
中创建的提交4个月前,我想看
project/src
和
project/include
正如他们在此提交中出现的那样,但我也想拥有
tests/short
和
test/long
因为它们同时在(然后分开)
test
存储库。
我了解两个存储库之间提交的顺序仅取决于时间,并且可能不是很精确。但这对我来说已经足够了。当然,我知道我不能保留每个 repo 的原始 git id。没关系,因为这两个 repos 实际上是从另一个 RCS 新导入的,因此没有任何地方记录过 git id。
应该可以逐一 checkout 每个存储库中的所有提交,按存储库中的时间排序,并提交生成的文件。是否已经有一个工具可以做到这一点?
请您参考如下方法:
[given all
project
content is insrc
andinclude
and alltests
content is inshort
andlong
,]If I checkout a commit that was created in project 4 months ago, I would like to see
project/src
andproject/include
as they appeared in this commit, but I would like also to havetests/short
andtests/long
as they were at the same time in the (then separate) test repository. […]Is there already a tool that would do this?
有,它的名字是
git filter-branch
.到目前为止,最简单的实现是走
project
历史和追捕“的”对应
tests
提交的内容,这是一个草图:
git init junk
cd junk
git remote add project /path/to/project
git remote add tests /path/to/tests
git remote update
git filter-branch --index-filter '
mydate=`git show -s --date=raw --pretty=%ad $GIT_COMMIT`
thetest=`git rev-list -1 --before="$mydate" --remotes=tests`
[[ -n $thetest ]] && git read-tree --prefix= $thetest
' -- --remotes=project
如果您的“测试”历史有数千次提交,这将变得很慢,如果您正在谈论 linux repo 或那种规模的东西,那么预先生成一个按日期排序的测试列表并逐步完成它会更便宜。