Узнайте создателя Git-ветки

159

Я хочу узнать, кто создал ветку.

Я вроде в состоянии сделать это с:

git branch -a | xargs -L 1 bash -c 'echo "$1 `git log --pretty=format:"%H %an" $1^..$1`"' _

Однако это возвращает последнего коммиттера на ветку, а не обязательно человека, который создал ветку.

Офир Фарчи
источник
7
Вы не можете получить автора / создателя ветки в git. То, что вы делаете здесь, это получить подсказку автора. Это изменится, как только кто-то введет туда новый коммит.
sylvain.joyeux
1
Отказ от ответственности: неявное предположение в этом вопросе / ответе «в рабочем процессе только с одним человеком на ветку ». В других рабочих процессах, где по крайней мере два коллеги совместно используют ветку, эта информация (создатель ветки) не доступна через git, и ответы выше могут привести кого-то к ложным предположениям.
RomainValeri

Ответы:

56

Ветвь - это не что иное, как указатель фиксации. Таким образом, он не отслеживает метаданные типа «кто создал меня». Посмотреть на себя. Попробуй cat .git/refs/heads/<branch>в своем репозитории.

Тем не менее, если вы действительно хотите отслеживать эту информацию в своем хранилище, ознакомьтесь с описаниями веток. Они позволяют вам прикреплять произвольные метаданные к филиалам, по крайней мере локально.

Также ответ DarVar ниже - очень умный способ получить эту информацию.

Кристофер
источник
Для меня это было в .git / refs /heads / <branch> «ref» был во множественном числе
Джеффри Лекурс
4
Ответ ДарВара, хотя, возможно, и полезен для некоторых, не является точным ответом. Это просто более лаконичный способ сделать то, что автор оригинального вопроса уже делал (а именно получить имя последнего коммиттера в ветке).
Пибоди
296

Вывести список удаленных веток Git по автору, отсортированному по дате коммиттера:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate
DarVar
источник
8
Это последний человек, который совершит эту ветку. Поскольку ветвь является просто указателем на коммит.
DarVar
7
Должно ли это работать на Windows? Я получил "Входной файл указан два раза".
Стив Чемберс
27
С табличным форматированием: git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }'(получил идею от stackoverflow.com/a/3631819 - возможно, потребуется скорректировать числа в awk printf в зависимости от максимальной длины даты / времени имени автора)
Гари С. Уивер
15
В случае, если в ветви не было никакого коммита и если он был создан из master, «автор ветки» совершенно не связан с этой веткой, а только последний коммиттер на master. Если вы извлекаете изменения из master и это ускоренная перемотка вперед, это снова последний коммиттер на master, который, возможно, никогда не работал в этой ветке.
Гюстав
9
Хотя этот ответ и команда потенциально полезны, я чувствую, что это вводящий в заблуждение ответ на вопрос. В этом списке перечислены имена авторов во всех ветвях, которые являются последними коммиттерами в ветке. Есть ряд обстоятельств, при которых это на самом деле не было бы создателем ветви. Реальный ответ в том, что git просто не хранит эту информацию.
Пибоди
46

Я подправил предыдущие ответы, используя --sortфлаг и добавил немного цвета / форматирования:

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authordate refs/remotes
Майк
источник
1
идеально подходит для обвинения в цветах
suarsenegger
8
git for-each-ref --format='%(authorname) %09 -%(refname)' | sort
KhaledMohamedP
источник
8

Добавление к ответу DarVar :

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | awk '{print $7 $8}'

PS: Мы использовали AWK, чтобы красиво напечатать автора и удаленную ветку.

suryakrupa
источник
3
это работает, только если имя автора - одно слово. Если имя и фамилия разделены, то вместо имени ветви вы увидите фамилию ...
Legato
5

Вы можете узнать, кто создал ветку в вашем локальном хранилище,

git reflog --format=full

Пример вывода:

commit e1dd940
Reflog: HEAD@{0} (a <a@none>)
Reflog message: checkout: moving from master to b2
Author: b <b.none>
Commit: b <b.none>
(...)

Но это, вероятно, бесполезно, так как обычно в вашем локальном репозитории вы создаете только ветки.

Информация хранится в ./.git/logs/refs/heads/ branch . Пример содержания:

0000000000000000000000000000000000000000 e1dd9409c4ba60c28ad9e7e8a4b4c5ed783ba69b a <a@none> 1438788420 +0200   branch: Created from HEAD

Последний коммит в этом примере был от пользователя "b", а ветка "b2" была создана пользователем "a". Если вы измените свое имя пользователя, вы можете убедиться, что git reflog берет информацию из журнала и не использует локального пользователя.

Я не знаю ни о какой возможности передать эту локальную информацию журнала в центральное хранилище.

Гюстав
источник
4

Мы можем узнать, основываясь на имени автора

git for-each-ref --format='%(authorname) %09 %(if)%(HEAD)%(then)*%(else)%(refname:short)%(end) %09 %(creatordate)' refs/remotes/ --sort=authorname DESC
tech2504
источник
1

Предполагая, что:

  1. ветвь была сделана из master
  2. не были объединены в masterеще

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1
Трезубец д'Гао
источник
0

Я знаю, что это не совсем вопрос вопроса, но если вы обнаружите необходимость фильтровать только коммиты по конкретному автору, вы всегда можете обратиться к grep :)

# lists all commits in chronological order that
# belong to the github account with
# username `MY_GITHUB_USERNAME` (obviously you
# would want to replace that with your github username,
# or the username you are trying to filter by)


git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -committerdate | grep 'MY_GITHUB_USERNAME'

Удачного кодирования! :)

avocadojesus
источник
0

для тех, кто ищет DESC ... это похоже на работу --sort=-

ты для форматирования, плохо знакомый с этим ... мои глаза теряют часть его налитого кровью

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=-authordate refs/remotes

дополнительная ссылка: https://stackoverflow.com/a/5188364/10643471

Роб Би
источник
-1

Насколько я знаю, вы можете видеть, являетесь ли вы только создателем ветки. На это указывает первая строка в .git / ref /heads / <branch>. Если это заканчивается «Создано из головы», вы являетесь создателем.

Kendor
источник