2012-05-23 57 views
4

我试图将多个提交(包含提交消息中特定故障单号1234的提交)导出到修补程序文件。作为补丁导出特定的Git提交

编辑工作脚本是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的格式补丁的执行失败:

$ ./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 [^ 

另一个interseting效果是,如果我在for循环硬编码grep '992ab41d3539539bd609209beed33a9de2f4277a',因为-x选项bash的命令输出(是不带引号和它的作品。

+ grep 992ab41d3539539bd609209beed33a9de2f4277a 

在哪里这些报价来自何处,我如何摆脱他们?

+0

脚本正常工作一个在我的机器(我的仓库)。我不知道什么是错的。您的存储库是否可公开访问 – miaout17

+0

它对我来说也很好!我无法猜测你的最后有什么问题:( – positron

+0

对不起,git仓库不公开,你是否在一个包含提交信息的版本库中执行它,其中包含“#1234”的消息,否则它不会尝试做任何事情。 – Alex

回答

4

我混帐隐式的使用--color选项,这样的$COMMIT字符串包含一些颜色代码。所以这搞砸了解析。有趣的是,这些颜色也包含在我的错误信息中。

但你没有看到终端(这只是丰富多彩),也没有粘贴到堆栈溢出后。

解决的办法是:

 
commits=`git log --no-color --pretty=oneline | grep "#1234" | cut -f1 -d" "` 
1

有越来越提交的名单更简单的方法:

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