Как я могу предотвратить нажатие мерзавца, если локальные модификации обнаруживаются (включая неотслеженные файлы)?

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

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

У кого-либо есть какие-либо решения?

6
задан Clintm 14 May 2010 в 00:41
поделиться

5 ответов

Вы можете использовать хук 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 или скрипт конфигурации, который разработчики запускают, не глядя.)

6
ответ дан 17 December 2019 в 00:05
поделиться

Возможно, укажите псевдоним в вашей оболочке или в конфигурации git, который заменяет команду push по умолчанию на собственный сценарий, который сначала выполняет git status и проверяет наличие " рабочий каталог чистый »? Я не знаю, возможно ли перезапись push или это сделает так, что вы не сможете затем вызвать настоящий push. Просто идея из головы, так что я понятия не имею, действительно ли это работает.

0
ответ дан 17 December 2019 в 00:05
поделиться

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

1
ответ дан 17 December 2019 в 00:05
поделиться

Чтобы автоматически добавлять изменения, вы можете использовать флаг -a. Из git-commit man page:

Укажите команде, что она должна автоматически автоматически переносить файлы, которые были изменены и удаленные, но новые файлы, о которых вы о которых вы не сообщили git, не затрагиваются.

Кажется, нет никаких флагов для git commit, который добавляет неотслеживаемые файлы. Не забывать делать git add . перед коммитом - лучшее решение, которое я могу придумать.

0
ответ дан 17 December 2019 в 00:05
поделиться

В итоге я добавил 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>
0
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: