Как я могу отслеживать, откуда взялись коммиты после их объединения?
Моя компания не поддерживает репозиторий git
(мы эффективно используем CVS), но я сохраняю репо локально для своего собственного здравомыслия. Раньше я хотел воспитывать коммиты, связанные, скажем, bug-report-abcde
. Я могу grep через сообщения фиксации найти bug-report-abcde
и просмотреть их. Прямо сейчас у меня есть функция Emacs, подключенная для обеспечения текущего имени ветки как "заголовка" в commit:
Title
Summary summary summary
Branch: bug-report-abcde
Таким образом, мой вопрос: это лучший способ найти, какая ветвь была исходным источником коммита, после того, как коммит был объединен с другой ветвью? Или есть способ извлечь эту информацию из самого git
?
Ответы
Ответ 1
Git не отслеживает эту информацию по дизайну.
http://markmail.org/message/yfb5ihwddjmrstz6
So don't think of it as "git throws away branch identity" as much as
"git never cared about branch identity in the first place, and doesn't
think it relevant."
Название вашей ветки - это имя вашего ветки. Это может быть буквально все, что вы хотите. Или вы не можете использовать название ветки и находиться в состоянии отдельной головы. В долгосрочной перспективе сохраняется только фиксированная доступность.
Если у вас есть информация, которую вы хотите отслеживать (например, номер дефекта), вам необходимо включить ее в сообщение фиксации.
Если вы используете центральный сервер, вы можете настроить крюк приема, который каким-то образом регистрирует информацию о имени удаленного ветки (git notes
). Моя компания использует это. Я нахожу это только квази-полезным (в основном, если вы хотите кричать на менеджера программы, а не на парня, который написал или нажал код).
Ответ 2
merges-introducing() {
# merges-introducing $introducing [$descendant]
local introducing;
if introducing=`git rev-parse $1`; then
shift
git rev-list --ancestry-path --parents --reverse ^$introducing ${@-HEAD} \
| awk '{seen[$1]=1} NR>1 && !seen[$2] {print $1}' \
| xargs -r git show --oneline --no-patch
fi
}
Находит слияния, включающие фиксацию из объединенной истории.
git rev-list
--ancestry-path
перечисляет только фиксации на линии спуска из нижнего фиксации (^$introducing
здесь) вверх (по умолчанию HEAD
, текущая проверка), --parents
дает родителям для каждого из них --reverse
перечисляет коммиты с самого начала (сначала $introducing
), а постобработка awk|xargs
печатает только слияния, чей первый родитель не находится на этом пути предков.
Если кто-то не вошел и не отредактировал вручную сообщения о слиянии, строки темы для этих коммитов скажут название ветки и любой исходный url соответствующих (и не fastforward) слияний, самых старых в первую очередь.