所以我将另一个存储库合并到当前存储库的子目录中,如下所示:
git remote add -f Bproject /path/to/B
git merge -s ours --no-commit Bproject/master
git read-tree --prefix=dir-B/ -u Bproject/master
git commit -m "Merge B project as our subdirectory"
但是,似乎存在微妙的问题。当我做的时候
git log dir-B/
结果只是“合并B项目作为我们的子目录”消息。如何获取所需的日志信息,即导入的dir-B历史记录?
答案 0 :(得分:4)
您的合并提交会在example.txt
中显示BProject/master
,并重命名为dir-B/example.txt
。除非使用git log
选项,否则--follow
不会跟踪文件/目录过去重命名的历史记录:
--follow
Continue listing the history of a file beyond renames (works only for a single file).
如果您真的非常渴望正确显示差异,您可以重写Bproject/master
历史记录,就好像项目一直位于目录dir-B
中,然后进行普通合并。这意味着合并历史的SHA与Bproject/master
上的SHA无关!时间戳,作者和提交消息都将保留其原始值。
如果你想这样做,我建议先单独克隆Bproject
,然后在该克隆中运行:
git-filter-branch manpage
To move the whole tree into a subdirectory, or remove it from there:
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
在您确认新历史记录看起来正确之后,您可以将重写的版本作为遥控器添加到主项目中,并使用普通合并将其合并。
答案 1 :(得分:0)
基于r3m0t重写历史的想法,以下几行为我做了整个技巧,将另一个git存储库作为新分支合并到我现有的存储库中进入子目录:
(在git-sh
工作我可以省略领先的' git'命令)
co -b my-new-branch
remote add -f origin-my-old-standalone-project ../my-old-standalone-project/
pull origin-my-old-standalone-project master
mkdir my-new-subdir
ci -am "merge 'old' standalone project as new branch 'my-new-branch'"
git filter-branch --index-filter \
'git ls-files -s | sed "s%\t\"*%&my-new-subdir/%" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
之后我同时拥有:新子目录中的单个文件的历史记录,就像它们一直在那里一样,以及主目录中的正常历史记录,就好像子目录中的新文件一直是那里。 (正如你所看到的,没有必要使用read-tree或任何其他日常使用的命令,' filter-branch'完成整个技巧。)IDE能够(分别应该是;成功测试了PyCharm)与结果一起正常工作。
之后,您应该能够正常合并您的分支,将所有项目合并为一个。
tl; dr: --follow
按预期正常工作,执行上述6个命令后将旧git项目合并到其他git项目的新分支和子目录