我怎样才能得到两个date之间发生的所有提交与Git之间的差异?
或者只是在两个date之间发生的所有提交? 在SVN中,你可以做类似的事情
svn diff -r{date}:{date}
去做吧! 我似乎无法find与此相当的Git。
具体来说,我正在编写一个脚本来发送每天的电子邮件与当天所有的代码和谁。
你可以使用git whatchanged --since="1 day ago" -p
它也需要一个--until
争论。
文件
以前的build议有一些缺点。 基本上,我正在寻找一些相当于cvs diff -D"1 day ago" -D"2010-02-29 11:11"
。 在收集越来越多的信息的同时,我find了解决办法。
我已经尝试过的事情:
-
git whatchanged --since="1 day ago" -p
从这里但是,即使在一个文件中有多个提交,这也会为每个提交提供差异。 我知道“date”在git中是一个松散的概念 ,我认为一定有办法做到这一点。
-
git diff 'master@{1 day ago}..master
给出一些警告warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.
并不显示所有的差异。 -
git format-patch --since=yesterday --stdout
不给我任何东西。 -
revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1)
以某种方式工作,但似乎复杂,并不限于当前分支。
最后:
-
git diff $(git rev-list -n1 --before="1 day ago" master)
似乎可以工作,并且是一种默认的做类似的事情 ,虽然比我想象的要复杂。
有趣的是,git-cvsserver不支持“cvs diff -D”(没有logging在某处)。
“date”在git中是一个松散的概念。 一个提交会有一个作者的date,可能在某些人真的将提交提交到提交到他们的存储库之前,也可能会重新提交和更新,以提交一个显然更新的提交。
一个提交也有一个提交date,如果一个提交被重新发布或以任何方式修改,则更新。 这些提交更有可能是按照某种时间顺序进行的,但是您仍然在提交者的摆布之下,在他的计算机上设置了正确的时间,即使如此,未经修改的提交也可以无限期地放在远程存储库的特性分支上被合并到中央存储库的主分支中。
可能对您的目的最有用的是特定存储库上的reflogdate。 如果您启用了per-branch reflogs(请参阅git config core.logAllRefUpdates
),则可以使用ref@{date}
语法来引用分支在特定时间的位置。
例如
git log -p master@{2009-07-01}..master@{now}
您也可以使用“模糊”描述,如:
git log -p "master@{1 month ago}..master@{yesterday}"
这些命令将显示在存储库的给定分支中“出现”的所有提交,而不pipe它们的作者和提交date实际上有多“旧”。
请注意,每分支reflog特定于一个存储库,所以如果您在克隆上运行log命令,并且不拉(例如)一个月,则同时提取上个月的所有更改,那么上个月的所有更改都会显示在@{1 hour ago}..@{now}
范围内。 如果你能够在人们推到的“中央”仓库上运行日志命令,那么它可以做你想做的事情。
git diff --stat @{2013-11-01}..@{2013-11-30}
要么
git diff --stat @{2.weeks.ago}..@{last.week}
也许
$ git format-patch --committer=<who> --since=yesterday --stdout
是你想要的(有或没有“–stdout”)?
这更有趣,因为可能有更好的办法。 这将显示今天的所有提交散列。
git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`
;·)
您也可以使用git-format-patch来准备补丁(差异)并通过电子邮件发送。
使用选项[自]或[修订范围]指定提交范围。
我相信一般的解决scheme是使用:
git rev-list -n1 --first-parent --until=<a date string> <a ref>
没有–first-parent,你可能会得到一个分支的提交,后来被合并到a ref
但是没有被合并到a date string
。
下面是使用--children
和grep
代替-n1
的替代方法:
mlm_git_ref_as_of() { # # Examples # # # Show all commits between two dates: # # git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400') # # Show diffs of all commits between two dates: # # git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400') local as_of="$1" local ref="${2:-HEAD}" # Get the most recent commit (--children, grep -v ' ') that was on # the given branch ($ref, --first-parent) as of a given date # ($as_of) git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' ' }
在阅读这个Q&A之前,我对git whatchanged
并不熟悉,但是对于我来说结果却是截然不同的,所以我不确定它在做什么。
另一个简单的方法是,您可以比较某个date以来所有更改的差异,只需find该date或之后发生的第一个提交X
,然后使用
git diff X
这有一个优点,就是它不依赖于新鲜克隆中的reflog条目,不像
git diff <reference>@{n}.. git log <reference>@{n}..
解决scheme
我会扔我的方式: git log
date为您提供当前分支提交哈希。 然后我只是使用像git diff 8fgdfg8..565k4l5
这给我适当的差异聚合文件。 希望这有帮助,但没有testing太多