2014-07-24 61 views
3

我不知道这是一个bash问题或git问题,但我完全难住。Git过滤分支,变量和bash

我有以下bash脚本:

#!/bin/bash 

FILE=testfile.c 

sha1=`git log --pretty=oneline --branches -- $FILE | tail -1 | cut -f 1 -d' '` 
sha2=044ec18c3c4efe9ef44daf7479b9f71d89720690 

echo "sha1=.$sha1." 
echo "sha2=.$sha2." 

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch '"$FILE"'' -- ${sha1}^.. 

从而未能与下面的输出:

$> ./script.sh 
sha1=.044ec18c3c4efe9ef44daf7479b9f71d89720690. 
sha2=.044ec18c3c4efe9ef44daf7479b9f71d89720690. 
fatal: ambiguous argument '044ec18c3c4efe9ef44daf7479b9f71d89720690^..': unknown 
revision or path not in the working tree. 
Use '--' to separate paths from revisions 

但如果我只是通过在git filter-branch线使用sha2代替sha1改剧本,它的工作原理和产生如下输出:

$> ./script.sh 
sha1=.044ec18c3c4efe9ef44daf7479b9f71d89720690. 
sha2=.044ec18c3c4efe9ef44daf7479b9f71d89720690. 
Rewrite 044ec18c3c4efe9ef44daf7479b9f71d89720690 (1/1139)rm 'talairach_avi/SVIP_Child_Comp_N24_as_orig.4dfp.img' 
Rewrite d30e314d7b6e2f62fa26e62dc83fc5083b92085b (2/1139)rm 'talairach_avi/SVIP_Child_Comp_N24_as_orig.4dfp.img' 
Rewrite f2897cd0d17b75de70aca1baa70e6cb40243d0a1 (3/1139)rm 'talairach_avi/SVIP_Child_Comp_N24_as_orig.4dfp.img' 
... 

sha1sha2具有完全相同的值。为什么使用硬编码的sha2变量工作,但分配的变量sha1不起作用?我怎样才能使它与sha1一起工作?我试过每一个可能的单/双引号排列/组合,但无济于事。

我非常感谢在此事上的任何投入。谢谢。

EDIT1: 虽然单独回波语句出现相同的,通过od管道回波的输出产生不同的输出:

$> echo $sha1 | od -x 
0000000 5b1b 3333 306d 3434 6365 3831 3363 3463 
0000020 6665 3965 6665 3434 6164 3766 3734 6239 
0000040 6639 3137 3864 3739 3032 3936 1b30 6d5b 
0000060 000a 
0000061 

$> eco $sha2 | od -x 
0000000 3430 6534 3163 6338 6333 6534 6566 6539 
0000020 3466 6434 6661 3437 3937 3962 3766 6431 
0000040 3938 3237 3630 3039 000a 
0000051 

EDIT2:解决如通过下面的评价中可以看出问题已通过git配置为彩色输出解决。取消设置此配置可解决问题。 git config --global color.ui false

+0

我会假设它会与非打印字符和引用有关 - 尝试在双引号(sha1 =“'...”等;)中包装两个赋值,以及在最终命令' - “$ {sha1}^..”'。看看是否改变了一切。 – zebediah49

+0

@ zebediah49我尝试完全按照你的建议,并且在使用'sha1'而不是使用'sha2'时仍然失败:( –

+1

我的第一个目标也是nonprintables。通过'od -x'管道回显输出,看看结果仍然是相同的。 – Harald

回答

2

问题原来是颜色字符串(%C(yellow)和相应的%C(reset),或多或少)被迫进入git log输出。这似乎很奇怪,因为color.ui应该在管道输出时自动关闭。

但是,在任何情况下,为了获得所需的提交SHA1,您可以通过使用git rev-list而不是git log --pretty=oneline以及通过命令提取SHA-1来回避整个问题。也就是说,不是,:

git log --pretty=oneline --branches -- $FILE | tail -1 | cut -f 1 -d' ' 

可以使用简单:

git rev-list --branches -- $FILE | tail -1 

(不幸的是,--reverse -n 1消除tail步骤失败:git rev-list生成列表,它限制了一个承诺,然后反转它,它只是让你第一个承诺,而不是最后)。

+0

+1对rev-list的推荐 – knittl