我不知道这是一个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'
...
sha1
和sha2
具有完全相同的值。为什么使用硬编码的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
我会假设它会与非打印字符和引用有关 - 尝试在双引号(sha1 =“'...”等;)中包装两个赋值,以及在最终命令' - “$ {sha1}^..”'。看看是否改变了一切。 – zebediah49
@ zebediah49我尝试完全按照你的建议,并且在使用'sha1'而不是使用'sha2'时仍然失败:( –
我的第一个目标也是nonprintables。通过'od -x'管道回显输出,看看结果仍然是相同的。 – Harald