0

有许多问题试图将 CVS 的能力映射cvs diff -D "1 days ago"到 git:

Git - 如何列出两次在主分支上更改的所有文件?

如何使用 Git 获取两个日期之间发生的所有提交之间的差异?

但是根据我对这个问题的评论的理解:

复制 Git 裸仓库会更改日志吗?

执行git diff --name-only master@{"5 day ago"} master是您机器本地的,无法解决合并到 master 的问题。

我在想我需要使用git whatchanged并基于另一个问题(Bash script to extract filenames from git whatchanged)也许

git show --pretty="format:" --name-only HEAD^

但充其量我似乎在想我必须编写一个有点脆弱的脚本来解析特定日期内特定参考的各种 git 输出,然后将这些参考重定向到其他 git 命令以隔离在这些参考中修改了哪些文件,最后 concat结果。

我很震惊 git 还没有提供这个功能,因为我觉得它是一个基本的特性,特别是因为从我上面提到的问题来看,git 并没有完全重现 CVS 的美妙优势,cvs diff -D "1 days ago"如果 CVS 有git 上的东西,那么好吧,我对人性失去了所有的信心。

有人可以证明我错了吗?有没有办法可靠地查询 master 中的任何文件是否在一段时间内通过合并或提交进行了更新?

问题

这是我所做的导致我来到这里的:

  1. 对您的存储库进行多次提交并将它们推送到源
  2. 现在获取裸存储库并使用cp -r --preserve
  3. 从此复制的裸存储库中,执行git clone copy_of_everything
  4. copy_of_everything运行中git diff --name-only master@{"5 day ago"} master或自从您在步骤 1 中提交这些提交以来已经过了多久。

你会发现,至少我做到了,git diff --name-only master@{"5 day ago"} master因为你执行了克隆,所以找不到任何未完成的提交。

这似乎是无法接受的。那里的日志以长格式告诉我我需要知道的内容,但是我所知道的没有一两个命令可以告诉我自某个日期以来哪些文件已被修改。

更新 1

sleske 的评论似乎一针见血。git diff --name-only master@{"5 day ago"} master,基于 reflog 是一个坏主意,因为它基于对存储库状态的本地修改。

那么有没有不错的选择?

另外,感谢用户:qqx 首先用这个问题将我指向这个方向。

更新 2

有。sleke(现已接受)的回答解释了原因。

简而言之,我需要执行:

git diff --name-only $(git log --until="1 days ago" -n1 --format=%H master ) master

恢复了对人性的信仰。

4

2 回答 2

1

不幸的是,我对cvs diff -D. 我假设它显示了自给定时间以来对文件所做的所有更改。如果你想用 git,你可以这样做:

git log --until="1 days ago" -n1 --format=%H

这将打印 master 上超过 1 天的最后一次提交。

然后使用该提交的 ID 来获取一天前的提交与当前 HEAD(即分支的当前状态)之间的差异:

git diff <ID from step before> HEAD

这将打印一个完整的差异。要获取文件列表,--stat请在末尾添加选项。这将为您提供摘要,例如:

 a/data.c      |  14 ++++++++
 b/stuff.c     |   2 +-
 b/code2.c     |  54 +++++++++++++++++------

我不知道用一个命令就能做到这一点;当然,您可以将两者结合在一行中(假设您使用bash):

git diff $(git log --until="1 days ago" -n1 --format=%H) HEAD 

注意:这也将获取由合并引起的文件更改。它只是比较给定的两个提交(旧提交和 HEAD)的存储库状态。

于 2013-02-16T03:31:09.387 回答
0

git diff "master@{a month ago}".."master@{last week}"从 reflog 中给出这些日期之间的差异,做一个whatchanged和一些 post-massage 会给你改变的文件。

于 2013-02-16T03:34:50.717 回答