Git игнорировать файл после первоначального нажатия (только для чтения)

Я хочу зафиксировать начальную версию файла в Git, а затем запретить модификации этого файла. Как это можно сделать? Я пытался: - добавление файла в .gitignore после первоначального нажатия (но это не сработает, потому что файл уже отслеживается). - git rm -rf --cached, но это удаляет файл из репозитория при следующей фиксации.

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

evolutionxbox 13.09.2018 14:41
.gitignore здесь не может помочь. Вы можете написать локальный pre-commitGit-крючок, который отклоняет фиксацию, если желаемый файл был изменен. Локальный перехватчик Git не копируется на сервер и не мешает другим разработчикам изменять файл. Хук на стороне сервера более эффективен.
axiac 13.09.2018 15:36

«Я хочу зафиксировать начальную версию файла в Git, а затем запретить модификации этого файла» - это неестественно для Git. Вы боретесь с инструментом. почему ты хочешь сделать это? Это файл конфигурации? Существуют устоявшиеся шаблоны для работы с подобными вещами.

Chris 13.09.2018 15:49

Это не то, что git может сделать, или, по крайней мере, я не знаю как, но вы можете сделать это в gitlab. Думаю, что-то подобное есть в git lfs, посмотрите здесь: github.com/git-lfs/git-lfs/wiki/File-Locking

ErniBrown 13.09.2018 15:53

@axiac Да, я согласен, единственный способ добиться желаемого - это использовать git-ловушку на стороне сервера. Существует также функция gitlab, которая предоставляет то же самое, но я не использую gitblab atm. Спасибо за то, что вводите every1.

Luka Špoljarić 13.09.2018 16:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
419
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы планируете использовать для этого .gitignore, я предполагаю, что вы согласны с настройкой для этого каждого локального репозитория. Если это так, вы можете использовать git update-index --skip-worktree path/to/file. Это предотвратит фиксацию и / или отслеживание изменений в файле.

Да, но тогда каждому программисту НЕОБХОДИМО выполнить команду skip-worktree локально, если кто-то забудет это сделать, он отменит наши изменения при следующем нажатии (для ясности, именно так мы делаем это сейчас, но я был просто интересно, есть ли способ лучше)

Luka Špoljarić 18.09.2018 08:23
Ответ принят как подходящий

Встречал такую ​​же проблему при программировании. В моем проекте есть файл с именем setting.cfg. Но моим коллегам следует немного изменить это для своего окружения. Мы хотим поделиться файлом setting.cfg и изменить его, не отправляя его в удаленный репозиторий.

Наконец, мы создали файл с именем setting.cfg_bak и проигнорировали setting.cfg:

git rm setting.cfg
echo "setting.cfg" >> .gitignore`

Если вы хотите использовать файл, вам следует скопировать setting.cfg_bak в setting.cfg и изменить setting.cfg для своих нужд. После этого модификация не будет отправлена ​​в удаленный репозиторий.

Это то, что мы делаем сейчас, но я пытаюсь понять, можем ли мы как-то автоматизировать это без необходимости копировать / вставлять.

Luka Špoljarić 14.09.2018 10:34

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

Danilo Souza Morães 14.09.2018 22:06

Это не сработает, если вы клонируете репозиторий и измените его.

ramwin 17.09.2018 06:01

В этом случае каждый, кто клонировал репозиторий, должен выполнить команду. Это не проще и не проще, чем скопировать файл setting.cfg_bak.

ramwin 17.09.2018 06:05

Это может быть даже более опасно, если кто-то изменил файл и забыл выполнить команду.

ramwin 17.09.2018 06:07

Я не понял требования должным образом. В этом случае я согласен, что лучший вариант - иметь файл bak в репозитории, точно так же, как файлы .env, и на сервере, который вы устанавливаете этот файл вручную, и заставляете код искать оба файла, всегда отдавая приоритет тому, у которого нет версий. Скажем, вы хотите распространить файл db.config: вы добавляете в git mydb.config с конфигурациями localhost, и код сначала ищет db.config, а если он его не находит, ищите mydb.config. Таким образом, вы все еще можете иметь рабочую версию, просто клонируя ее, и по-прежнему иметь уникальную версию на сервере.

Danilo Souza Morães 18.09.2018 19:48

Вот такой сценарий. Вы и ваш коллега работаете над проектом. Он содержит файл конфигурации с именем setting.cfg, есть много общих настроек для вас и вашего коллеги, но только онлайн-host=<Your Ip> должен изменяться для разных компьютеров. Итак, вы создали базовый файл конфигурации с host=<Please change this IP to your computer's IP> и отправили его в удаленный репозиторий. Даже тот, кто клонирует проект, должен иметь этот файл и изменить эту строку, но никогда не должен фиксировать это изменение в удаленном репозитории.

ramwin 19.09.2018 03:27

Другие вопросы по теме