2014-07-24 63 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