Вы можете делать что хотите, используя ловушку предварительной фиксации :
перед фиксацией
Этот хук вызывается git-commit
, и его можно обойти с помощью опции --no-verify
. Он не принимает параметров и вызывается до получения предложенного сообщения журнала фиксации и создания коммита. Выход из этого сценария с ненулевым состоянием приводит к прерыванию команды git commit до создания коммита.
Простой код, приведенный ниже, преобразует любые изменения в file2.py
непосредственно перед фиксацией и отказывается создавать любую новую пустую фиксацию, то есть, если единственным измененным файлом был file2.py
.
#! /bin/bash
if ! git diff-index --quiet --cached HEAD -- file2.py; then
echo Discarding file2.py changes from the index
git reset HEAD -- file2.py
if git diff-index --quiet --cached HEAD; then
echo Aborting empty commit 1>&2
exit 1
fi
fi
Теперь, когда на академический вопрос был дан ответ, я предлагаю использовать другой подход, потому что ловушка намеренно отбрасывает усилия по управлению версиями двух разных разновидностей file2.py
обратно на пользователя. Если вы хотите выполнять ручное управление версиями, зачем вообще использовать git?
Вместо этого позвольте git выполнять свою работу, поместив ваши изменения в отдельную ветку
git checkout --no-track -b feature/singrium origin/master
что как мастер меняется (к которому вы догоняете, запустив git fetch
)
git checkout feature/singrium
git rebase origin/master
или в который вы периодически сливаете изменения из мастера.
git checkout feature/singrium
git merge origin/master
Разница между git rebase
и git merge
в соответствующих историях, которые они производят. Если ваши изменения в file2.py
невелики и локализованы для небольшого числа коммитов, то при подходе rebase эти коммиты объединяются в виде патча поверх того, чем является последний мастер. Если ваша история более громоздкая, слияния могут быть проще, по крайней мере, в краткосрочной перспективе.