【问题标题】:Finding first and last commit for every subfolder in directory查找目录中每个子文件夹的第一个和最后一个提交
【发布时间】:2021-03-06 04:00:48
【问题描述】:

我需要遍历目录中的每个文件夹并找到负责第一次和最后一次提交的用户。在 git bash 中有什么聪明的方法可以做到这一点吗?我尝试使用 Python 中的 subprocess 模块对此进行研究,并使用它来遍历文件夹,但不确定这是一个好方法

我试过的是

  • git log -- path/to/folder: 此解决方案仅列出对该子文件夹的所有提交。但我希望只过滤第一次和最后一次提交。我还希望遍历目录中的所有文件夹
  • 此 stackoverflow 线程 link 中的回复:它们似乎对我不起作用(不打印,或者给出错误)

【问题讨论】:

  • 你看过 GitPython 模块吗? gitpython.readthedocs.io/en/stable
  • 你也可以看看这个问题:stackoverflow.com/questions/10073154/…
  • 乍一看,他们似乎专注于文件的提交历史,而不是目录,所以它并不能完全解决我的问题。但我会更彻底地看一下,谢谢!
  • 我认为它对目录也适用,但我想这是我的一个误解。
  • 你能更详细地描述一下git log -- path/to/folder 不适用的地方吗?

标签: python git


【解决方案1】:

假设你只对当前分支感兴趣,你可以通过 Git Bash 获得第一次提交

git rev-list HEAD -- path/to/folder | tail -1

以及最后一次提交

git rev-list HEAD -- path/to/folder | head -1

git rev-list 类似于git log,但它是"plumbing" command。与git log 之类的“porcelain”命令相比,“Plumbing”命令的用户友好性稍差一些,但无论您的个人设置如何,它们都可以保证始终如一地运行,而“porcelain”命令可能会根据您的配置有不同的输出。因此,在编写脚本/程序时使用“管道”命令通常是个好主意。

git rev-list 默认只返回提交哈希,但您可以使用类似于git log--pretty/--format 选项。

headtail 需要更长的输入——在​​这种情况下,是路径的整个提交列表——并且只返回第一/最后 n 行,其中 n 是您作为参数提供的任何数字。 git loggit rev-list 首先显示最近的提交,因此您需要 tail 获取第一个提交,head 获取最后一个提交。

您还可以使用

获取最后一次提交
git rev-list HEAD -1 -- path/to/folder

没有到head 的管道。但是,您无法使用 Git 的内置提交限制选项获得第一次提交,因为例如

git rev-list HEAD --reverse -1 -- path/to/folder

应用-1限制器first,在应用--reverse之前只返回最后一次提交。

最后,值得注意的是,Git 并不真正跟踪目录,只跟踪文件。如果您创建一个没有文件的文件夹,则无法提交该文件夹,并且如果您删除文件夹中的所有文件,那么就 Git 而言,该文件夹不再存在。结果是:这些命令将为您提供与目录中的任何文件(及其子目录)相关的第一个和最后一个提交,而不是目录本身。这种区别可能对您的方案很重要,也可能不重要。

【讨论】:

  • 谢谢你非常详细的回复,对我很有用
【解决方案2】:

我最终解决了子进程的问题

import subprocess
import os

dir_path = os.path.normpath('C:/working/git/code-lib/application')
for f in os.listdir(dir_path):
    subpath = os.path.join(dir_path, f)
    subprocess_args = ['git', 'log', "--pretty=format:{'author': '%aN', 'date': '%as', 'email': '%ce'}", subpath]
    commits = subprocess.check_output(subprocess_args).decode().split('\n')
    print(f'{f} -- first: {commits[-1]}, last: {commits[0]}')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2021-03-04
    • 2011-12-04
    • 2013-06-24
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多