Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ScoobyОтветов: 2

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

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

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

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

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

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

gitgithubgithub-apigit-branch

Ответы

Ответ 1 · рейтинг 4 · nulltoken

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

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

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

  • Синтаксис: GET /repos/:owner/:repo/branches/:branch
  • Пример: https://api.github.com/repos/libgit2/libgit2sharp/branches/coverity

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

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

{
  "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",

[...]

Ответ 2 · рейтинг 1 · Uwe Brandt

Если вы не возражаете против 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы