Я хочу зафиксировать начальную версию файла в Git, а затем запретить модификации этого файла. Как это можно сделать? Я пытался: - добавление файла в .gitignore после первоначального нажатия (но это не сработает, потому что файл уже отслеживается). - git rm -rf --cached, но это удаляет файл из репозитория при следующей фиксации.
.gitignore
здесь не может помочь. Вы можете написать локальный pre-commit
Git-крючок, который отклоняет фиксацию, если желаемый файл был изменен. Локальный перехватчик Git не копируется на сервер и не мешает другим разработчикам изменять файл. Хук на стороне сервера более эффективен.
«Я хочу зафиксировать начальную версию файла в Git, а затем запретить модификации этого файла» - это неестественно для Git. Вы боретесь с инструментом. почему ты хочешь сделать это? Это файл конфигурации? Существуют устоявшиеся шаблоны для работы с подобными вещами.
Это не то, что git может сделать, или, по крайней мере, я не знаю как, но вы можете сделать это в gitlab. Думаю, что-то подобное есть в git lfs, посмотрите здесь: github.com/git-lfs/git-lfs/wiki/File-Locking
@axiac Да, я согласен, единственный способ добиться желаемого - это использовать git-ловушку на стороне сервера. Существует также функция gitlab, которая предоставляет то же самое, но я не использую gitblab atm. Спасибо за то, что вводите every1.
Если вы планируете использовать для этого .gitignore, я предполагаю, что вы согласны с настройкой для этого каждого локального репозитория. Если это так, вы можете использовать git update-index --skip-worktree path/to/file
. Это предотвратит фиксацию и / или отслеживание изменений в файле.
Да, но тогда каждому программисту НЕОБХОДИМО выполнить команду skip-worktree локально, если кто-то забудет это сделать, он отменит наши изменения при следующем нажатии (для ясности, именно так мы делаем это сейчас, но я был просто интересно, есть ли способ лучше)
Встречал такую же проблему при программировании. В моем проекте есть файл с именем setting.cfg
. Но моим коллегам следует немного изменить это для своего окружения. Мы хотим поделиться файлом setting.cfg
и изменить его, не отправляя его в удаленный репозиторий.
Наконец, мы создали файл с именем setting.cfg_bak
и проигнорировали setting.cfg
:
git rm setting.cfg
echo "setting.cfg" >> .gitignore`
Если вы хотите использовать файл, вам следует скопировать setting.cfg_bak
в setting.cfg
и изменить setting.cfg
для своих нужд. После этого модификация не будет отправлена в удаленный репозиторий.
Это то, что мы делаем сейчас, но я пытаюсь понять, можем ли мы как-то автоматизировать это без необходимости копировать / вставлять.
зачем вам версия файла с именем setting.cfg_bak, если вы можете зафиксировать settings.cfg и git update-index --skip-worktree setting.cfg
? Таким образом, каждый пользователь может обновить свою копию файла setting.cfg, не беспокоясь о внесении этого изменения. Мой ответ кажется именно тем, о чем вы просили
Это не сработает, если вы клонируете репозиторий и измените его.
В этом случае каждый, кто клонировал репозиторий, должен выполнить команду. Это не проще и не проще, чем скопировать файл setting.cfg_bak
.
Это может быть даже более опасно, если кто-то изменил файл и забыл выполнить команду.
Я не понял требования должным образом. В этом случае я согласен, что лучший вариант - иметь файл bak в репозитории, точно так же, как файлы .env, и на сервере, который вы устанавливаете этот файл вручную, и заставляете код искать оба файла, всегда отдавая приоритет тому, у которого нет версий. Скажем, вы хотите распространить файл db.config: вы добавляете в git mydb.config с конфигурациями localhost, и код сначала ищет db.config, а если он его не находит, ищите mydb.config. Таким образом, вы все еще можете иметь рабочую версию, просто клонируя ее, и по-прежнему иметь уникальную версию на сервере.
Вот такой сценарий. Вы и ваш коллега работаете над проектом. Он содержит файл конфигурации с именем setting.cfg
, есть много общих настроек для вас и вашего коллеги, но только онлайн-host=<Your Ip>
должен изменяться для разных компьютеров. Итак, вы создали базовый файл конфигурации с host=<Please change this IP to your computer's IP>
и отправили его в удаленный репозиторий. Даже тот, кто клонирует проект, должен иметь этот файл и изменить эту строку, но никогда не должен фиксировать это изменение в удаленном репозитории.
Насколько мне известно, вы не можете защитить ни один файл, ни даже модификации локально клонированного репо. Однако вы можете защитить ветки на удаленном компьютере.