将特定的Git提交导出为补丁文件

4

我正在尝试导出几个提交(那些在提交信息中包含特定票号1234的提交)到补丁文件。

编辑 工作脚本位于 https://github.com/amenk/SelfScripts/blob/master/git-extract-patches

这是我所拥有的

#!/bin/bash -x
commits=`git log --pretty=oneline | grep "#1234" | cut -f1 -d" "`
no=1;
for COMMIT in $commits
do
    git format-patch -1 $COMMIT --start-number=$no
    no=$(($no+1))
done

但由于某种原因,执行git format-patch命令失败:

$ ./getpatches.sh 
++ git log --pretty=oneline
++ grep '#6809'
++ cut -f1 '-d '
+ commits='da591d66f05513488ee06857edc9d24a046c179d
4fd781da9cc503b961f8e4c42bbb136d9e3c1806
3a9311f5507f91f830b44673c57f672e7aabaac0'
+ no=1
+ for COMMIT in '$commits'
+ git format-patch -1 'da591d66f05513488ee06857edc9d24a046c179d' --start-number=1
fatal: ambiguous argument 'da591d66f05513488ee06857edc9d24a046c179d': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

当我手动调用git format-patch -1 'da591d66f05513488ee06857edc9d24a046c179d' --start-number=1时,一切正常。
编辑:
我认为这与引号有关。如果我在循环中添加git log | grep $COMMIT,我会得到以下错误:
+ grep '992ab41d3539539bd609209beed33a9de2f4277a'
grep: Unmatched [ or [^

另一个有趣的效果是,如果我在for循环中硬编码grep '992ab41d3539539bd609209beed33a9de2f4277a' ,则命令输出(因为bash的-x选项没有引号)可以正常工作。
 + grep 992ab41d3539539bd609209beed33a9de2f4277a

这些引用来自哪里,我该如何去掉它们?

脚本在我的机器上(我的代码库)运行良好。我不知道出了什么问题。你的代码库是否公开可访问? - miaout17
对我来说它也很好用!我猜不出你那里出了什么问题 :( - positron
抱歉,Git存储库不是公共的。您是否在包含带有“#1234”的消息的提交的存储库中执行了它?否则它将不会尝试执行任何操作。 - Alex
如果你希望.patch文件按照你提交到仓库的顺序排列,可以将cut的结果传递给tac。例如:git log --oneline | grep "#1234" | cut -d' ' -f1 | tac - E-rich
2个回答

4
我的 git 隐含地使用了 --color 选项,因此 $COMMIT 字符串包含一些颜色代码。所以这搞乱了解析。有趣的是,我的错误信息中也包含着颜色。
但你在终端上看不到这一点(它只是彩色的),放到 Stack Overflow 上也一样看不到。
解决方法如下:
commits=`git log --no-color --pretty=oneline | grep "#1234" | cut -f1 -d" "`

2

获取提交记录列表有更简单的方法:

git log --format=%H --grep "CAT-300"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接