Как я могу предотвратить git push, если обнаружены локальные изменения (включая неотслеживаемые файлы)? - PullRequest
5 голосов
/ 14 мая 2010

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

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

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

Ответы [ 5 ]

6 голосов
/ 14 мая 2010

Вы можете использовать pre-push hook (начиная с git 1.8.2).

Ваш крюк предварительного толчка может проверить код выхода git status, возвращая 0 (ОК, чтобы нажать), если 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 или configure, который разработчики запускают, не просматривая.)

1 голос
/ 14 мая 2010

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

0 голосов
/ 15 мая 2010

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

Спасибо всем, кто ответил.

<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 голосов
/ 14 мая 2010

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

0 голосов
/ 14 мая 2010

Для автоматического добавления изменений вы можете захотеть использовать флаг -a. Из справочной страницы git-commit :

Скажите команду автоматически сценические файлы, которые были изменены и удалил, но новые файлы у тебя есть Git не сказал о не влияет.

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

...