为比特定日期更早的提交更改git commit消息

时间:2016-04-18 08:14:15

标签: git

我需要更新提交的提交消息,这些消息是在特定日期之前创建的。我对代码的想法:

git filter-branch -f --msg-filter '
    if [ "$GIT_AUTHOR_DATE" < "2012-11-01T00:00:00" ];
        then
            cat && echo "#imported"
        else
            cat &
    fi' 
HEAD

'if'语句可以比较日期大于/小于吗?

2 个答案:

答案 0 :(得分:2)

test program 1 通常可以比较这样的字符串,但它会进行字典比较。能够进行此类比较is an extension,但可以在LinuxMac 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

值得注意的变化:

  • &LT;替换为\&lt;,相当于-lt
  • 时间戳使用整数格式,前缀为&#34; @&#34;