这种情况:
我们基于现有的开源git repo(例如source-repo)创建了一个“私有” repo(例如our-repo)。
我们一直在开发代码,并且大约有20个合并到我们的仓库中。因此,存储库从“ State_Initial”移至“ State_Current”。
现在,出于商业原因,我们希望将所有开发工作移交给第三方。基于某些法律问题,唯一的选择是我们为他们提供所有更改的“单个”补丁文件。那是“ State_Initial”和“ State_Current”之间的压缩补丁。
我环顾四周,发现
git format-patch -X
但是,它会生成“ n”个.patch文件。
是否有创建单个补丁文件的方法,以便如果我们基于“ source-repo”创建一个仓库并应用补丁,它将带我们进入“ State_Current”?
感谢您的时间。
答案 0 :(得分:2)
以下命令将创建一个包含多个提交的单个.patch
文件。
git format-patch cc1dde0dd^..6de6d4b06 --stdout > foo.patch
然后您可以像这样应用它:
cat foo.patch | git am
注意:如果要包含第一个提交SHA,请确保使用^..
而不是..
。
答案 1 :(得分:1)
您可以使用git diff
:
git diff 0f3063094850 > ./test.patch
答案 2 :(得分:0)
创建一个名为squashed
的新分支,该分支具有单个squashed commit。该分支将具有与普通分支完全相同的内容,但没有历史记录。
仔细检查一下,如果满意,请使用format-patch
创建补丁文件。
$ git checkout -b squashed $(git commit-tree HEAD^{tree} -m 'Squashed history')
$ git format-patch --root HEAD
这是一种非破坏性的操作,之后您可以直接切换回正常的开发分支。您可以tag
压缩的分支来保存对您通过电子邮件发送的邮件的引用,或者如果不再需要它,可以使用branch -D
删除它。
$ git branch -D squashed
答案 3 :(得分:0)
如果出于某种原因您不希望创建一个一次性分支并压缩state_initial
和state_current
之间的所有提交,然后使用git format-patch
,则有另一种选择。如果您是从state_initial分支出来的,并且您的分支基于源分支的顶部进行了重新构建:
git format-patch source_branch <patch_file_name>
执行git am <patch_file_name>
时,它不会重建整个提交链。但是此补丁文件将是顺序的更改列表。如果您在多次提交中都进行了更改,并进行了更改,那么即使有人检查了补丁文件,仍然可以看到它。
答案 4 :(得分:-1)
git format-patch
可以将修订范围作为参数。参见git help format-patch
:
简介
git format-patch [-k] [(-o|--output-directory) <dir> | --stdout] ... (many flags omitted) [--progress] [<common diff options>] [ <since> | <revision range> ]
说明
...
有两种方法可以指定要执行的提交。
单个提交
<since>
,指定导致导致当前分支的尖端的提交不在历史记录中,而导致提交<since>
的历史记录。通用
<revision range>
表达式(请参见 gitrevisions (7)中的“指定版本”部分)表示在指定范围内的提交。
例如,以下命令为当前分支上的最后三个提交生成补丁:
git format-patch HEAD~3..HEAD