Предотвратить отслеживание файла другими ветвями - PullRequest
3 голосов
/ 23 мая 2019

У меня file.config сидит в моей основной ветке. Я хочу создать ветку feature из моего master , но я не хочу, чтобы в нем отображался мой file.config.

Зная, что я все еще хочу отслеживать изменения, которые происходят с этим файлом.

Есть ли способ сделать это?

EDIT: для контекста config.file является своего рода «кнопкой», которая развертывает код, вложенный в текущую ветку в производственной среде. Вот почему я не хочу, чтобы это было в какой-либо другой ветке, кроме "master", которая ограничивает риск человеческой ошибки.

Ответы [ 3 ]

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

Можно сказать вашему локальному мерзавцу, что определенный файл никогда не следует изменять, используя update-index .Это остановит отображение файла в git status и т. П., Сохраняя его в хранилище для всех остальных.

Важно отметить, что это изменение произойдет в вашем локальном git, а не в вашей ветке.Поэтому, если вы переключите ветки, они все равно будут действовать, и вы не сможете отправить это изменение на удаленный компьютер.

git update-index --skip-worktree file.config

И если вы хотите, чтобы изменения в этом файле отображались в git status снова запустите:

git update-index --no-skip-worktree file.config
1 голос
/ 23 мая 2019

Вы действительно, серьезно, не можете получить то, что вы хотите в Git. Причина довольно фундаментальная: файлы не отслеживаются и не отслеживаются в силу того, что они находятся в какой-либо ветви или не находятся в какой-либо ветви. Что делает файл отслеживаемым (а не отслеживаемым), так это его присутствие в (или отсутствие в) index . В то же время ветви имена просто идентифицируют один конкретный коммит , причем один коммит, который они идентифицируют, может быть изменен в любое время ... и каждый коммит может быть в много ветвей одновременно.

Эти три факта: (1) отслеживаемое по сравнению с неотслеживаемым является свойством текущего содержимого index , следовательно, напрямую не связано с каким-либо именем ветви; (2) названия ветвей изменяются со временем; (3) коммиты находятся в нескольких ветвях - все взаимодействуют так, что это довольно плохо для вашего варианта использования.

Чтобы понять это, вам нужно знать, как взаимодействуют коммиты, индекс и рабочее дерево, что происходит, когда вы используете git checkout с именем ветки или хешем фиксации, и как ветки создаются и перемещаются в генеральный. Все они связаны в один большой Гордиев узел ... и решение вашей реальной проблемы похоже: даже не пытайтесь развязать узел, просто обойдите весь беспорядок, оставив вместо этого прототип конфигурации. Приготовьте какой-либо процесс, который вам нужен, соберите или получите его по мере необходимости: это может быть просто: если я только что запустил git checkout master, скопируйте прототип на место; если я только что запустил git checkout, который снимает с меня master, удалите копию на месте, оставив только прототип.

(Если вы хотите автоматизировать это, посмотрите на post-checkout крючок.)

0 голосов
/ 23 мая 2019

Вы можете удалить файл из других веток, которые вы создаете из мастера , но , если затем объединить их обратно в мастер, файл будет удален в мастере (если вы не выходите из своего пути, чтобы избежатьэто, что всегда возможно).Если эти ветви никогда не будут объединены в master, то просто удалите файл из них.

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

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