У меня есть дюжина репозиториев в репозитории GitHub. Структура репозитория выглядит следующим образом:
+ project1
+------- trunk
+------- tags
+------- branches
+ ------- releases
+ project2
....
Наша политика требует удаления любой активной ветки через 30 дней бездействия. Однако не существует автоматического способа обнаружения такой неактивной ветки. Иногда у меня есть некоторые неактивные ветки, которые выживают после 30-дневной отметки.
Есть ли скрипт для перечисления веток, а также даты их последней фиксации во всех репозиториях GitHub?
Редактирование1. Есть ли способ узнать, сколько организаций и какие проекты они размещают с помощью API?
Ответ 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