Иногда кто-то в нашей команде делает нажатие мерзавца и повреждает сборку, потому что его локальная сборка работает, но он забыл фиксировать все свои локальные модификации и неотслеженные файлы мерзавцу, прежде чем он продвинет.
Я хотел бы предотвратить это... Я лился по документам в течение приблизительно одного часа сегодня и не мог найти, что что-либо встроило.
У кого-либо есть какие-либо решения?
Вы можете использовать хук pre-push
(начиная с git 1.8.2).
Ваш обработчик pre-push может проверить код выхода git status
, возвращая 0 (OK для нажатия), если git status
возвращает ненулевое значение, в противном случае возвращается 1 (не разрешить толкать).
На странице руководства для git-status
указано:
Если нет пути, который отличается между индексным файлом и текущим фиксацией HEAD (т.е. нет ничего, что можно было бы зафиксировать, запустив git commit ) команда завершается с ненулевым статусом.
Любое репо, созданное с помощью git 1.8.2 или новее, будет иметь pre-push.sample
в .git / каталог hooks
, который является полезной отправной точкой для реализации вашей политики. Здесь есть больше хороших примеров использования ловушки pre-push
: http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/
Имейте в виду, что ловушка не работает в репозитории восходящего потока. У каждого клона должен быть установлен этот хук, чтобы обеспечить соблюдение вашей политики. (Хуки не клонируются как часть репозитория. Поскольку хуки выполняются с помощью git, такая конструкция предотвращает запуск вредоносных хуков на машине разработчика. Вредоносный код вместо этого должен попадать в Makefile или скрипт конфигурации, который разработчики запускают, не глядя.)
Возможно, укажите псевдоним в вашей оболочке или в конфигурации git, который заменяет команду push по умолчанию на собственный сценарий, который сначала выполняет git status и проверяет наличие " рабочий каталог чистый »? Я не знаю, возможно ли перезапись push или это сделает так, что вы не сможете затем вызвать настоящий push. Просто идея из головы, так что я понятия не имею, действительно ли это работает.
Вы можете использовать различные хуки (я полагаю, предварительное получение), чтобы определить, нарушит ли push сборку и отклонит ли ее . В дополнение к этому вы должны сказать своим разработчикам, чтобы они запускали git status
перед любой операцией фиксации или принудительной отправки, что является невероятно разумным правилом, которое следует соблюдать и может предотвратить такие проблемы.
Чтобы автоматически добавлять изменения, вы можете использовать флаг -a
. Из git-commit
man page:
Укажите команде, что она должна автоматически автоматически переносить файлы, которые были изменены и удаленные, но новые файлы, о которых вы о которых вы не сообщили git, не затрагиваются.
Кажется, нет никаких флагов для git commit
, который добавляет неотслеживаемые файлы. Не забывать делать git add .
перед коммитом - лучшее решение, которое я могу придумать.
В итоге я добавил ant-мишень в нашу локальную сборку перед тем, как выложить в основное репо... вот мишень... на случай, если кто-то еще ищет шаг в правильном направлении.
Спасибо всем, кто ответил.
<target name="git-status-check">
<echo>Performing git working directory check for local modifications or untracked files.</echo>
<exec executable="git" failifexecutionfails="true"
outputproperty="git.check">
<arg value="status"/>
</exec>
<echo>${git.check}</echo>
<propertyregex property="dirty.working.dir" input="${git.check}" regexp="working directory clean"
select="\1" casesensitive="false" />
<fail message="Git status reports that you have local modifications or untracked changes in your working dir... did you forget to commit these changes? ${line.separator} ">
<condition>
<not>
<isset property="dirty.working.dir" />
</not>
</condition>
</fail>
<echo>Git status reported a clean working dir continuing build...</echo>
</target>