Исключить некоторые отслеживаемые файлы из постоянной фиксации - PullRequest
1 голос
/ 02 мая 2019

Я работаю над проектом, в котором я отредактировал некоторые файлы, которые были отслежены Git . Допустим, отредактированные отслеживаемые файлы:

files1.py
file2.py
file3.py

Все эти файлы существуют в удаленном хранилище. Однако я отредактировал один из файлов (например, file2.py), чтобы он был совместим только с моей машиной. Поэтому при фиксации я не хочу, чтобы этот файл был зафиксирован (я хочу, чтобы удаленная версия этого файла была неизменной).
Я знаю, что для этого есть команды:
из этой ссылки

git add
git reset --file2.py

Или по этой ссылке :
git update-index --assume-unchanged "file2.py"

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

1 Ответ

1 голос
/ 02 мая 2019

Вы можете делать что хотите, используя ловушку предварительной фиксации :

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

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