Как программно обнаружить неактивные ветки в репозиториях GitHub?

У меня есть дюжина репозиториев в репозитории GitHub. Структура репозитория выглядит следующим образом:

   + project1 
       +------- trunk
       +------- tags
       +------- branches
       + ------- releases
   + project2
       ....

Наша политика требует удаления любой активной ветки через 30 дней бездействия. Однако не существует автоматического способа обнаружения такой неактивной ветки. Иногда у меня есть некоторые неактивные ветки, которые выживают после 30-дневной отметки.

Есть ли скрипт для перечисления веток, а также даты их последней фиксации во всех репозиториях GitHub?

Редактирование1. Есть ли способ узнать, сколько организаций и какие проекты они размещают с помощью API?


person Scooby    schedule 26.08.2014    source источник
comment
Почему ваш репозиторий git организован таким образом, как будто это репозиторий subversion? Почему бы вам просто не сделать каждый ствол проекта отдельным репозиторием, теги и ветки затем стать первоклассными гражданами git.   -  person Charlie    schedule 26.08.2014
comment
Вы пишете I have a dozen projects in the GitHub repository. Вам нужно уточнить это. Вы имеете в виду, что храните все свои проекты в одном репозитории?   -  person jub0bs    schedule 26.08.2014
comment
@Jubobs Извините, они устроены как структура git с несколькими репозиториями в одной организации. и у каждого репо есть ствол (мастер), а затем несколько ветвей и выпусков, в которых фиксируется код. Я хочу отсканировать и проверить дату последней фиксации во всех ветвях для всех репозиториев.   -  person Scooby    schedule 26.08.2014
comment
@KuberKaul Я думаю, что ваше дополнение Edit1 выглядит как совершенно другая тема, которая заслуживает отдельного вопроса StackOverflow.   -  person nulltoken    schedule 27.08.2014


Ответы (2)


В этом вам поможет API репозитория GitHub.

Список филиалов

Получение сведений о филиале

Этот метод вызова предоставляет вершину ветки (то есть последнюю фиксацию), из которой вы можете получить дату фиксации. Исходя из этого, вы сможете оценить деятельность каждого филиала.

Ниже пример вывода сведений о ветке

{
  "name": "coverity",
  "commit": {
    "sha": "f341f3a1276cbec3f6ee9d02264bd4453ca20835",
    "commit": {
      "author": {
        "name": "nulltoken",
        "email": "[email protected]",
        "date": "2014-05-03T21:28:26Z"
      },
      "committer": {
        "name": "nulltoken",
        "email": "[email protected]",
        "date": "2014-05-09T11:10:01Z"
      },
      "message": "Configure Coverity Scan hook for Travis",
      "tree": {
        "sha": "a5092e975145b96356df6b57cbf50e2d8c6140f8",
        "url": "https://api.github.com/repos/libgit2/libgit2sharp/git/trees/a5092e975145b96356df6b57cbf50e2d8c6140f8"
      },
      "url": "https://api.github.com/repos/libgit2/libgit2sharp/git/commits/f341f3a1276cbec3f6ee9d02264bd4453ca20835",
      "comment_count": 0
    },
    "url": "https://api.github.com/repos/libgit2/libgit2sharp/commits/f341f3a1276cbec3f6ee9d02264bd4453ca20835",

[...]
person nulltoken    schedule 26.08.2014

Если вы не возражаете против python, ниже приведен фрагмент кода, в котором перечислены неактивные ветки голого репозитория:

#!/bin/env python3
import pygit2, os, datetime

repo = pygit2.Repository(pygit2.discover_repository(os.getcwd()))
time_now = datetime.datetime.now()
for branch in (repo.lookup_branch(b) for b in repo.listall_branches()):
    last_commit = branch.get_object()
    commit_time = datetime.datetime.fromtimestamp(last_commit.commit_time)
    age = time_now - commit_time
    if age > datetime.timedelta(days=30):
        print("{} {} {}".format(last_commit.author.email, branch.branch_name, commit_time))

Или версия сценария оболочки, которая удаляет ветки старше 100 дней:

git for-each-ref --sort=committerdate refs/ --format='%(committerdate:raw) %(refname:short)' | awk "\$1 < $(date -d "-100 day" "+%s") {print(\$3)}" | xargs git branch -D
person Uwe Brandt    schedule 17.07.2018