Git:列出一天(或一周/一个月...)中添加/修改的所有文件

65

在给定一段时间(例如一天、一周或一个月)内,是否可以列出所有在此期间修改或添加的文件?


谢谢大家提供了许多不同的解决方案!由于所有的解决方案都能解决我的问题,我想接受它们。我选择接受@inger的解决方案,因为我喜欢有修改/添加指示器... - thias
实际上,--name-status 也适用于 git log。另外请注意我的答案中的评论,指出了一个限制...很快会澄清。 - inger
7个回答

56

我会使用diff直接生成文件列表,例如:

git diff --name-only "@{3 days ago}" "@{2 days ago}"

changelog.txt
newfile.txt

如果您想知道哪个文件被修改或添加了,可以使用--name-status选项:

git diff --name-status "@{3 days ago}" "@{2 days ago}"

M       changelog.txt
A       newfile.txt

2
请注意,@{...}标记可能不可靠——它的粒度可能比实际提交要粗糙得多——因为它使用rev-log条目将日期映射到提交,并且仅为您的操作添加条目(例如,在拉取请求中并非为每个提交添加)。 - snogglethorpe
1
你是指reflog吗?无论如何,谢谢提醒 - 我本来会使用--since和--until,但似乎没有得到预期的结果。你知道更可靠的替代方法吗? - inger
是的,reflog :) (啊,为什么不能在5分钟后编辑评论...) - snogglethorpe
顺便说一句,我不确定为什么你在使用 --since--until(我猜你是指 git log)时遇到了问题——我经常使用它们,它们似乎总是按照提交粒度给出预期的结果(即使在 @{...} 无法使用的情况下)。@manojlds 的回答对我来说看起来很不错。 - snogglethorpe
我使用了 git diff--since/--until 参数,尽管在 man 手册中没有宣传,但似乎仍然有效。对于这种用例,我更喜欢使用 diff:它更直接;我一直在使用它来完成相同的任务,只是通常不带日期。我认为两者应该产生相同的结果,我将检查是否存在已知问题,并采取 git log 管道作为解决方法。 - inger
显示剩余2条评论

50
也许是这样:
  git log --since="1 day ago" --name-only --pretty=format: | sort | uniq

如果想要指定一天、一周等时间段,则包含 --until


你可以使用 -u 来节省一个命令:git log --since="1 day ago" --name-only --pretty=format: | sort -u。尽管这比简单的 git diff 更复杂,但另一方面,它可能会在当前的 git 中出现问题(请参见我的回答评论)。 - inger
不确定在这个解决方案中使用uniq是否合适。可能会有不同的提交具有相同数量的更改文件、插入和删除,如果将结果通过uniq管道传输,则这些提交将消失。 - i4h

40
我用这个方法获取一个干净的列表:
git whatchanged --since '04/14/2013' --until '05/22/2014' --oneline --name-only --pretty=format: | sort | uniq >> changedlist.txt

如何运行类似的命令以查看自2015年04月14日至2014年05月22日未更改的文件或在过去7天/一周内未更改的文件?谢谢。 - AKS
我在这里发布了一个答案:https://dev59.com/jF0Z5IYBdhLWcg3wbwCY,它处理了这篇文章所请求的相反情况,但是很有用。 - AKS
2
在当前版本的Git中,“git whatchanged”已被弃用,建议使用“git log”。https://git-scm.com/docs/git-whatchanged/2.21.0 - Devy

11

Git的whatchanged命令可以帮助你找到想要的内容,列出哪些文件被修改过。

以下是使用Git源代码的示例:

$ git --version
git version 1.7.8.rc0.35.gee6df
$ git whatchanged --since '10/27/2011' --until '10/30/2011' --oneline
55e7c0a (squash) test for previous
:100755 100755 dbf623b... 53905a2... M  t/t8006-blame-textconv.sh
2564aa4 blame.c: Properly initialize strbuf after calling, textconv_object()
:100644 100644 173f286... e39d986... M  builtin/blame.c
e8e1c29 Update draft release notes to 1.7.8
:100644 100644 3045245... ddb8d37... M  Documentation/RelNotes/1.7.8.txt
8debf69 clone: Quote user supplied path in a single quote pair
:100644 100644 488f48e... efe8b6c... M  builtin/clone.c

2
在当前版本的Git中,“git whatchanged”已被弃用,建议使用“git log”。https://git-scm.com/docs/git-whatchanged/2.21.0 - Devy

9

这里是另一个没有空行的例子:

git log --after="2015-11-05T16:36:00-02:00" --before="2015-11-15T16:36:00-02:00" --pretty=format:"" --name-only | sed '/^\s*$/d' | sort | uniq -u

5
尝试:
git log --since="2天前" --until="1天前"
如果省略--until,则会获取最近两天的日志。您还可以指定周、月等。您也可以使用带有--since和--until参数的git diff。稍微调整一下输出格式即可完成。

0

Git BASH 命令

git whatchanged --since '11/24/2017' --until '11/29/2017' --oneline --name-only --pretty=format: | sort | uniq >> changedlist.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接