我需要更新提交的提交消息,这些消息是在特定日期之前创建的。我对代码的想法:
git filter-branch -f --msg-filter '
if [ "$GIT_AUTHOR_DATE" < "2012-11-01T00:00:00" ];
then
cat && echo "#imported"
else
cat &
fi'
HEAD
'if'语句可以比较日期大于/小于吗?
答案 0 :(得分:2)
test
program 1 通常可以比较这样的字符串,但它会进行字典比较。能够进行此类比较is an extension,但可以在Linux,Mac OS X和大多数BSDs上使用。
这样做有很多问题:
必须从shell转义<
或>
。 [ "abc" < "def" ]
使用参数/bin/[
和"abc"
运行]
,标准输入从文件def
重定向,假设文件def
存在(否则您获得错误)。
如前所述,比较是词典。这意味着要比较日期,它们必须采用这种比较产生正确结果的形式。使用ISO 8601格式实际上是可行的,因为字段是固定大小并且是大端顺序。但是,filter-branch
不会以ISO 8601格式导出日期。例如,你得到的东西看起来像1460884741 -0700
。第一个数字是自1970年以来以秒为单位的时间戳,第二个是时区偏移量(您应该在很大程度上忽略它并直接在UTC中工作)。
除了这些问题之外,您的消息过滤器还需要避免使用cat
命令进行后台处理。因此,你想要的是:
首先,将2012-11-01T00:00:00转换为UTC时间戳。这有点棘手。我们可以使用python及其time.mktime
,但这坚持进行本地时间校正,因此我们必须取消本地时间校正,这部分取决于DST是否有效。我的本地时区偏移是-08:00,但在DST(例如现在)期间,当它是-07:00时除外。这可能会在一小时后关闭(这是我第一次粘贴,我甚至没有注意到;现在编辑修复):
$ python -c 'import time; print(int(time.mktime((2012,11,1,-8,0,0,0,0,0))))'
1351728000
要验证这是正确的时间戳:
$ env TZ=UTC date -r 1351728000
Thu Nov 1 00:00:00 UTC 2012
然后,在--msg-filter
中使用此值,并根据需要在$GIT_AUTHOR_DATE
或$GIT_COMMITTER_DATE
中的第一个(非偏移)字段进行数字比较:
... --msg-filter 'cat; set $GIT_AUTHOR_DATE; \
test $1 -lt 1351728000 && echo "#imported"' ...
当然,关于使用git filter-branch
的所有其他常见警告都适用。
1 /bin/[
是指向/bin/test
的链接。当test
被调用为[
时,它会查找结束]
,但在同一程序中。它也内置于许多shell中以提高速度,但仍然实现了相同的语义。 2
2 或至少,假设这样做。
答案 1 :(得分:0)
感谢torek的想法,我更新了我的脚本:
[x] Fold/Unfold all children of a fold point
值得注意的变化: