我正在尝试将一个本地git仓库中的文件移动到另一个不同项目的本地git仓库中,同时保留原始仓库中的历史记录。目前为止,如果在源代码库中从未移动或重命名过该文件,则下面的代码可以正常工作:
# Executed from a directory in the target repository
( cd $SOURCE_REPOSITORY_DIRECTORY && git format-patch -B -M --stdout --root $SOURCE_FILENAME) | git am --committer-date-is-author-date
这能够奏效是因为两个仓库的目录结构相同。如果它们不同,我就必须创建补丁文件并使用
sed
或其他工具来修复目录名称。无论如何,当我遇到一个被重命名的文件时,情况就会变得有些棘手。即使我指定了
-B -M
(并且使用-B -M -C --find-copies-harder
也得到了相同的结果),我也无法获得移动前的补丁,尽管文件已经被干净地移动(相似度指数为100%)。这特别奇怪,因为
git log --follow
显示了所有提交,而git log --follow -p
提供了所有差异。除了它们以相反的顺序提供,所以我无法将它们输入git am
。还要注意的是,
git log --follow -p 文件名
会输出以下“补丁”以显示重命名:diff --git a/old_dir_name/dir1/dir2/filename b/new_dir_name/dir0/dir1/dir2/filename
similarity index 100%
rename from old_dir_name/dir1/dir2/filename
rename to new_dir_name/dir0/dir1/dir2/filename
现在,如果
git log
能够以正确的格式和顺序显示补丁,让git am
应用它们,那我就可以直接使用它了,但事实并非如此。使用git log --reverse --follow -p 文件名
仅输出名称更改补丁,没有其他内容。那么,我该如何让
git format-patch
按照帮助文件/手册所说的真正遵循重命名,并同时仅输出单个文件的补丁?或者,我该如何让git log -p
以一种可以将其馈送到git am
中以重新创建带有历史记录的文件的方式生成补丁?我正在使用git版本1.8.4.3。
git
命令提供,并带有适当的标记。因此,我不会将你宝贵的贡献标记为采纳答案。 - Old Pro