Как я могу предотвратить переключение веток в git, когда есть неотслеживаемые модификации? - PullRequest
0 голосов
/ 04 сентября 2018

Git не позволяет переключаться на другую ветку, если у меня есть незафиксированные изменения, которые будут перезаписаны извлечением.

Git позволит переключаться на другую ветку, если изменения не противоречат.

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

Спасибо, Эяль

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Поскольку нет хука pre-checkout, невозможно предотвратить переключение ветвей. Но у Git есть хук post-checkout, который позволяет автоматически переключаться на предыдущую ветку / состояние при наличии одного или нескольких неотслеживаемых файлов.

Вот образец post-checkout. Разверните его под .git/hooks и сделайте его исполняемым.

#!/bin/bash

foo=$(git config --get my.foo)
if [[ "$foo" = "yes" ]];then
    exit 0
fi

oldref=$1
newref=$2
flag=$3
if [[ "$flag" -eq 1 ]] && [[ "$(git status --porcelain | grep -oe '^??' | uniq)" = ?? ]];then
    echo "There are untracked files. Go back to the previous state."
    git -c my.foo=yes checkout -
fi
exit 0
  1. flag равно 1 при оформлении ветки и 0 при оформлении файлы.
  2. ?? - это статус для неотслеживаемых файлов.
  3. -c my.foo=yes предотвращает бесконечный вызов post-checkout. Если вы хотите обойти это post-checkout, запустите git -c my.foo=yes checkout .... Вы можете назвать my.foo, что отличается от любой существующей переменной конфигурации.
  4. git checkout - - это ярлык для возврата в предыдущее состояние.
0 голосов
/ 04 сентября 2018

Я не знаю и не могу найти ни одной конфигурации, которая изменила бы, как checkout работает таким образом.

Вы можете написать скрипт, который проверяет незафиксированные изменения и, только если их нет, вызывает checkout. (Например, вы можете использовать git diff --quiet HEAD для проверки того, что ваше рабочее дерево выглядит как последний коммит, плюс git diff --quiet --cached HEAD, если вы хотите дополнительно убедиться, что вы не вносили изменения, а затем отменить их в рабочем дереве.) Затем вы можете псевдоним, который, если вы хотите, или просто вызываете его напрямую, делают «более безопасные» проверки ветвей.

Самая безопасная вещь - всегда проверять, что вы собираетесь совершить (или, по крайней мере, то, что вы собираетесь нажать; обычно вы можете довольно легко отменить коммит, если заметите, что он ошибочен, прежде чем нажать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...