LINUX.ORG.RU

Как узнать, что мерж был произведен в режиме --no-ff

 , ,


1

1

Всем доброго.

Преамбула.

На работе в качестве системы управления версиями используется TFS(буэээ). Так как пользоваться ей совершенно неудобно, пилится свое решение на основе gitlab.

Амбула.

Уже практически все запилено - репа в гитлабе, бранч мастер которой соответствует ветке в ТФС. Скриптами подтягиваются изменения из ТФС и отправляются в гитлаб, так же, мержреквесты в гитлабе отправляются в ТФС.

Осталась одна проблема - если мержить в режиме --no-ff (по-умолчанию в гитлабе), то в ТФС все улетает одним коммитом - это неприемлемо. В исходниках гитлаба я нашел и поправил участок, который отвечает за мерж, теперь мерж делается в режиме --ff. Но если --ff сделать невозможно, гитлаб без предупреждений мержит в режиме --no-ff. Теперь вопрос - можно ли узнать, в каком режиме был сделан мерж? Я хочу детектить режим и откатывать его, если он произведен в режиме --no-ff, дабы пользователь сначала ребейзнулся.

★★★★

Последнее исправление: panter_dsd (всего исправлений: 1)

Если я правильно понял задачу, то не понимаю в чём трудность. --ff не создаёт merge-коммит, а --no-ff создаёт, так и определять. Коммит является merge-коммитом, если у него больше одного родителя.

Но если --ff сделать невозможно, гитлаб без предупреждений мержит в режиме --no-ff

Это не gitlab, а git. Чтобы он этого не делал нужно указывать --ff-only.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)
Ответ на: комментарий от panter_dsd

можно анализировать титл последнего коммита

Зачем? Если можно посмотреть количество родителей. Да и использование --ff-only должно дать желаемое поведение без дополнительных действий.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Я не нашел, как заставить гитлаб добавлять ключ --ff-only

panter_dsd ★★★★
() автор топика
Ответ на: комментарий от xaizek

Зачем? Если можно посмотреть количество родителей.

Этого недостаточно, при --no-ff родителей всегда будет два, даже есть один из них уже был ff. Нужно сравнить совпадает ли tree мержа со вторым из них: git rev-parse master^{tree} == git rev-parse master^2^{tree}

Dendy ★★★★★
()
Последнее исправление: Dendy (всего исправлений: 1)

Я хочу детектить режим и откатывать его, если он произведен в режиме --no-ff, дабы пользователь сначала ребейзнулся.

ребейзнулся

Надеюсь это опечатка и имелось в виду «дабы пользователь сначала сделал ff-коммит руками». Иначе непонимая принципов гита вы вводите на проекте порочную практику паразитных зависимостей.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Нет, именно git rebase master. Да, это очень плохо, но тут приходится учитывать связку, которая не должна поломаться.

panter_dsd ★★★★
() автор топика

В исходниках гитлаба я нашел и поправил участок, который отвечает за мерж, теперь мерж делается в режиме --ff.

Рекомендую почитать какую-нибудь литературу зачем придумали --no-ff, чтобы не начинать портить историю своего проекта. Если вкратце, то когда через --ff мержится другой ff-коммит, то просто перемещается указатель без создания нового коммита, но это вы и так знаете. Так вот, если тот ff-коммит также был мерж-коммитом какой-нибудь локальной фиче-ветки, то порядок родителей в нём будет неопределён, поскольку его делал руками автор фичи на своём локалхосте без каких-либо правил что куда вливать. После этого git log --first-parent mybranch перестанет показывать историю изменения ветки mybranch и станет показывать мусор из фич-веток. Именно поэтому на автоматизированном сервере по умолчанию не доверяют последовательности родителей в фиче-ветках и мержат их с --no-ff, чтобы не портить историю той ветки, в которую вливается фича.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Еще раз повторюсь - основное хранение это ТФС и там должны сохраниться все коммиты в линейной последовательности. Какие ты варианты можешь предложить?

panter_dsd ★★★★
() автор топика

Поставь Gerrit и будет тебе счастье

annulen ★★★★★
()

Амбула.

Нет такого слова, болван

anonymous
()
Ответ на: комментарий от panter_dsd

основное хранение это ТФС

Упустил сей момент. Если нужно в итоге отправлять всё в линейную историю, то можно отправлять коммиты из git log --first-parent. Другими словами каждый коммит будет одна готовая законченная фича, влитая в итоге в основную ветку.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Вы советуете ровно то, от чего ТС хочет избавиться

в ТФС все улетает одним коммитом - это неприемлемо

German_1984 ★★
()
Ответ на: комментарий от panter_dsd

Нет, именно git rebase master. Да, это очень плохо, но тут приходится учитывать связку, которая не должна поломаться.

Ничего плохого в этом нет. Даже при использовании чистого git это просто один из многих вариантов workflow, в вашем же случае это вообще неизбежно.

Я не нашел, как заставить гитлаб добавлять ключ --ff-only

А с чего вы решили что в gitlab предусмотрены все ваши странные хотелки? Берите исходники и добавляйте --ff-only.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.