我正在尝试将文件从一个本地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 filename
推出以下“补丁”以显示重命名:
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 filename
输出名称更改补丁,仅此而已。
那么,我如何才能git format-patch
真正按照帮助文件/手册页所说的方式重命名,同时只为单个文件输出补丁? 或者,我如何git log -p
以一种可以将它们输入的方式生成补丁git am
以重新创建具有历史记录的文件?
我正在使用 git 版本 1.8.4.3。