предотвратить git checkout от перезаписи файла - PullRequest
4 голосов
/ 01 октября 2010

Другой разработчик проверил свой .rvmrc в репозитории git. С тех пор я удалил его и добавил в gitignore, но каждый раз, когда нужно вернуться назад, он перезаписывает мой .rvmrc. Я нахожусь на OSX, поэтому я обнаружил, что могу использовать механизм блокировки файлов OSX (флажок «Заблокировано» в Get Info), чтобы остановить это на моем компьютере разработчика, но как это сделать в Linux?

Я назначил его пользователю root и выполнил chmod до 444, но git (запускается как мой обычный пользователь) каким-то образом превосходит необходимость владения и разрешения и по-прежнему перезаписывает файл.

1 Ответ

4 голосов
/ 01 октября 2010

По иронии судьбы, хотя поведение git по умолчанию заключается в том, что неотслеживаемые файлы считаются ценными, добавление файла в .gitignore говорит git о том, что он может уничтожить файл, когда захочет.используется для обозначения сгенерированных файлов, и поэтому git будет перезаписывать их без вывода сообщений.Записи в .git/info/exclude, возможно, предполагается использовать для локальных версий файлов конфигурации.

Пожалуйста, прочитайте это обсуждение во всей его полноте, поскольку, как представляется, существует некоторая путаница в отношении разницы междудва.Я только что попробовал это, и записи в .git/info/exclude защищены, когда вы возвращаетесь назад во времени, создавая «ошибку: не отслеживаемый файл рабочего дерева .rvmrc будет перезаписан слиянием».Это различное поведение между этими двумя, возможно, не было преднамеренным, согласно Хунио С. Хамано.Однако, если вы можете удалить запись из .gitignore и переместить ее в .git/info/exclude, вы сможете выполнить эту работу, осознав, что последняя не является версионной или общей для репозиториев и потребует ручного сотрудничества с вашим коллегой.

Что касается проблемы с разрешениями, см. Это:

$ touch foo
$ ls -l foo
-rw-r--r--  1 josh  staff  0 Oct  1 09:55 foo
$ sudo chown root:wheel foo
$ ls -l foo
-rw-r--r--  1 root  wheel  0 Oct  1 09:55 foo
$ unlink foo
$ ls -l foo
ls: foo: No such file or directory

В Unix возможность создания или удаления файла основана только на разрешениях каталога , которыесодержит это.Разрешения на сам файл предназначены только для модификации файла (к сожалению, в вашем случае).Утилита rm вежливо проверяет разрешения для файла, но unlink является более низким уровнем и слепо вызывает системный вызов.

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