Перехватчик сервера Git для молчаливого игнорирования изменений в определенных файлах

В центральном репозитории git мне нужно игнорировать изменения в определенных файлах, когда они помещаются в репозиторий. Я не хочу отклонять (терпеть неудачу) весь push, а просто игнорирую эти изменения. Могу ли я использовать git-ловушку, которая просто отфильтрует некоторые изменения?

Я думал об использовании фильтров, но не уверен они будут использоваться в центральном репо, поскольку он «голый», например, не имеет рабочей копии.

Подробности: в сценарии, аналогичном this, десятки разработчиков настаивают изменения в этих файлах. Я пробовал использовать git update-index --assume-unchanged в центральном репозитории, но он сбрасывается при каждом нажатии "случайным" разработчиком, который затем распространяется на остальных разработчиков, когда они отключаются. Я не могу поменять сразу все репозитории разработчиков. Я хочу сделать изменение один раз в центральном репо, а затем проигнорировать изменения в этих файлах.


person user2481449    schedule 13.06.2013    source источник


Ответы (2)


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

По этой причине обычно лучше отказаться от ловушки или попросить всех ваших разработчиков установить ловушку перед фиксацией, которая делает что-то сопоставимое.

Если вам нравится боль, вот схема того, как это сделать в ловушке pre-receive / update:

  • Проверьте с помощью чего-нибудь, связанного с git rev-list, не были ли затронуты какие-либо из файлов, о которых идет речь. Если нет, просто спаситесь, потому что следующие шаги будут довольно болезненными.
  • Временно проверьте историю, которая была до отправки (это можно сделать с помощью сценария git-new-workdir contrib).
  • Составьте список новых коммитов.
  • Примените каждый из них, немедленно внося изменения в соответствующие файлы.
  • Избавьтесь от временной проверки.
  • Обновите ветку и сделайте выход ловушки с ненулевым кодом (это приведет к отображению ошибки, но вы можете отправить красивое сообщение вместе с ней). Это предотвращает нормальный процесс push от обновления самой ветки и отмены вашей тяжелой работы.
person Jan Krüger    schedule 13.06.2013

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

В вашей ситуации наиболее разумным решением является на самом деле отклонение коммитов, которые изменяют эти файлы со значительными ошибками, такими как «Вы не можете изменять следующие файлы:…», и обучение ваших коммитеров.

person kirelagin    schedule 13.06.2013