从 github 代码组织到 CSV/Json 的所有分支检索 all/recent 提交历史

Retrieve all/recent commits history from all branches from a github code organization to CSV/Json

我想从 GitHub 代码组织中获取所有提交历史记录,该代码组织由 225+ 个代码回购私有以及 public 组成。 我在 google 和 Whosebug 中看到了很多其他解决方案,但一个都没有。 我正在寻找一种自动化解决方案,我们可以在其中一次获取或检索所有提交历史记录,然后从特定日期安排它 根据 GitHub Api 的说法,我无法做到这一点,因为它没有每天对 GitHub 服务器的 API(s) 命中限制。

主要是我试图将所有提交信息提取到一个 CSV 文件中。如果有 python code/script 满足此目的,请分享。

如果您试图获取单个存储库的提交历史记录,以下脚本会很有帮助,

git log > data.csv

对于 225 个存储库,您需要分别对每个存储库使用此命令,可能采用 for 循环或 while 循环的形式。

如果存储库位于平面目录中,您可以使用 oneliner 执行此操作。

ls -d **/ | xargs -I{} -P12 git -C {} log --all --after="<date> 00:00" --before="<date> 23:59"

在使用 api

时无法解决每天的限制

之前也有类似需求。使用以下 python 逻辑解决了它。 我希望您已经为所有代码库执行了克隆,并且您的 ssh 个人访问密钥已添加到您的 git 全局配置中。

  1. 对于所有存储库,您可以将它们添加到列表中并循环遍历以获取列表中提到的代码存储库的所有分支的远程源 updates/ref-HEADs。
  2. 使用 git log 最初使用 git log --all 获取所有提交,然后使用 git 根据您的要求自动获取 weekly/monthly log --all after={date}
  3. 使用 csv 模块以漂亮的格式写入 git 日志,并将输出一致地附加到 csv 文件。

请找到下面的代码片段。

import os
import csv

#Dummy Blank CSV for adding newline in csv module
dummy = "<Path:>/dummy.csv"

#Loop through your set of repos 
list = ["Code repo 1", "Code repo 2"]
for repo in list:
    os.chdir(repo)
    # git pull all the remote origin updates from all branches
    cmd1 = "git pull --all".format(repo)
    os.system(cmd1)
    #git log all (for initial log) & then update it with --after=<date> (from a specified date - you can automate/schedule it)
    cmd2 = "git log --all --after=2021-06-10 --pretty=format:'{},%h,%an,%ad,%s' > {}.csv".format(repo,repo)
    os.system(cmd2)
    src = "{}.csv".format(repo)
    #To append here as CSV I have used csv module
    tf = open('<Path:>/Gitlog-output.csv', 'a+', newline="")
    if os.path.getsize('<Path:>/{}.csv'.format(repo)) != 0:
        #Writing each git log data to the above output file and conditional newline if there isn't a commit in any branch.
        tf.write(open(src).read())
        tf.write(open(dummy).read())
    tf.close()

    print("Finished logging {}".format(repo))
    # To track the list of remaining repos from your list
    print("Remaining Repos: {}".format(len(list) - list.index(repo) -1 ))
    print("#####################################")