Не удается выполнить git pull из-за конфликта с локальным исключенным файлом - PullRequest
2 голосов
/ 09 апреля 2019

У меня есть файл конфигурации, который я исключил локально. Я не использовал .gitignore, потому что другие члены команды обновляют файл, но мои локальные изменения применяются только к моей машине. Я использовал этот вопрос для справки о том, как исключить файл: Как настроить git на локальное игнорирование некоторых файлов?

Член команды обновил файл, и теперь я не могу выполнить git pull. Я получаю ошибку:

error: Your local changes to the following files would be overwritten by merge:
    config/td_config.php
Please commit your changes or stash them before you merge.

Но мой локальный показывает никаких изменений в td_config.php, потому что он исключен. Я не могу зафиксировать или спрятать его.

Мои вопросы:

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

  2. Как обойти эту проблему?

я пытался git update-index --no-assume-unchanged config/td_config.php безрезультатно.

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

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

Потому что это не то, что assume-unchanged делает ; на самом деле это для совершенно противоположной цели (жирным шрифтом добавлено):

Предположим, без изменений нельзя злоупотреблять механизмом игнорирования. Это «Я знаю, что моя файловая система работает медленно. Я обещаю Git, что Я не буду менять эти пути, делая их с этим битом - таким образом, Git не должен проверять, менял ли я там каждый раз, когда я попросить вывод 'git status' ". Это не означает ничего, кроме тот. Тем более, это не обещание Git, что Git всегда будет считают, что эти пути не изменены --- если Git может определить путь помеченный как предполагаемый неизменный, изменился без дополнительная стоимость lstat (2) оставляет за собой право сообщить, что путь был изменен (в результате "git commit -a" может свободно коммитить это изменение).

Да, существует множество ресурсов, рекомендующих assume-unchanged игнорировать локальные изменения отслеживаемого файла. Они почти все не правы, и вопрос, о котором вы спрашиваете, - один из способов, которым это может не сработать.

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

Как мне обойти эту проблему?

skip-worktree - лучший вариант , но он также не идеально подходит. Гораздо лучшим решением является координация с вашей командой , переименование отслеживаемого файла в td_config.template.php или аналогичное и игнорирование td_config.php.

.

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

(Если вы действительно хотите игнорировать этот совет, вы сможете git update-index --no-assume-unchanged файл, затем сохранить ваши изменения, затем потянуть, затем применить ваши изменения, а затем повторно применить бит. Но делайте это, зная, что это не делает то, что вы хотите .

Edit:

ОП прокомментировал, что

Когда я изначально настроил это, я попробовал update-index, skip-worktree и файл исключения ... так что на данный момент довольно сложно понять, насколько точно git отслеживает или не отслеживает файл.

Запуск git ls-files -v config/td_config.php помогает нам выяснить, какие из этих настроек активны в этом файле. В этом случае мы получили

S config/td_config.php

Заглавная буква S показывает, что skip-worktree установлено и что assume-unchanged не задано в файле. Выполнение git update-index --no-skip-worktree config/td_config.php должно вернуть его в «обычное состояние», после чего можно использовать любое из предыдущих предложений.

0 голосов
/ 09 апреля 2019

Сохраните файл, затем потяните
git stash
git pull
git stash pop

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