Git - 从一段时间以来,如何通过合并或提交可靠地查询master中的任何文件是否已更新?

时间:2013-02-16 03:09:33

标签: git cvs git-diff

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

Git - How can I list all files changed on the master branch between two times?

How can I get the diff between all the commits that occurred between two dates with Git?

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

Does copying the Git bare repo change the log?

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

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

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

但最多我似乎认为我必须编写一个有点脆弱的脚本来解析特定引用的特定引用的各种git输出,然后将这些引用重定向到其他git命令以隔离那些refs中修改的文件,最后得出结果。

我感到震惊的是,git已经没有提供这个,因为我认为这是一个有点基本的功能,特别是因为从我上面提到的问题来看,git并没有完全复制{的优点。 {1}}如果CVS有一些关于git的东西,那么,我已经失去了对人性的所有信念。

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

问题

以下是我所做的让我在这里的事情:

  1. 对您的存储库进行一些提交并将它们推送到原始
  2. 现在使用裸存储库并使用cvs diff -D "1 days ago"
  3. 复制它
  4. 从此复制的裸存储库中,执行cp -r --preserve
  5. git clone copy_of_everything运行copy_of_everything或者自从您在第1步中提交这些提交以来已经过了多长时间。
  6. 你会发现,至少我做过,git diff --name-only master@{"5 day ago"} master无法找到自你执行克隆以来未完成的任何提交。

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

    更新1

    斯莱斯克的评论似乎在头上打了一针。基于reflog的git diff --name-only master@{"5 day ago"} master是一个坏主意,因为它基于本地修改到存储库状态。

    那么还有一个不错的选择吗?

    另外,感谢User:qqx首先将这个问题指向了这个方向。

    更新2

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

    简而言之,我需要执行:

    git diff --name-only master@{"5 day ago"} master

    人类的信仰得到恢复。

2 个答案:

答案 0 :(得分:1)

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

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

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

然后使用该提交的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)的存储库状态。

答案 1 :(得分:0)

git diff "master@{a month ago}".."master@{last week}"给出了来自reflog的那些日期之间的差异,做一个whatchanged和一些后按摩会给你更改的文件。