2016-05-05 4 views
1

Недавно я переместил свои материалы программирования из локального хранилища в сетевое хранилище. С тех пор Git работает некорректно.Git wont сброс разрешений для файлов через cifs mount

Типичный сценарий:
Я меняю файлы. Теперь я хочу сохранить изменения. Я делаю git stash. Git откатывает изменения. Однако файлы по-прежнему отмечены как измененные в git status. git diff -p показывает

diff --git a/file.txt b/file.txt 
old mode 100644 
new mode 100755 

Я попытался сбросить файлы, выполнив

  • git checkout -- file.txt
  • git reset --hard

, но ничего не работает. Единственный способ снова очистить рабочую копию - chmod 644 file.txt.


Файлы лежат на NAS Synology. Я монтирую cifs на свою Linux-машину. Я играл с вариантами крепления noperm, file_mode, dir_mode, но не могу заставить его работать.

Я читал около git config core.filemode false, но я не уверен, правильно ли это сделать здесь. Я боюсь повредить свой репозиторий. Сохраняет ли Git информацию о разрешениях в репозитории/индексе? Могу ли я это проверить? Возможно, я уже сделал что-то неправильно с моими регентами.

ответ

0

Вы не можете использовать Git на границе операционной системы и, возможно, на период Samba/CIFS, потому что она заставляет маску файла на новые и измененные файлы. См. this 2013 discussion на сайте Atlassian. Несколько лет назад я надеялся использовать Windows SourceTree на Git repo на моем локальном сервере разработчиков (экземпляр Ubuntu VM на моей локальной системе) по карте Samba, но этого не было. Я все еще использую VM для dev-сервера, поскольку мне ужасно сложно работать в Windows со средами, которые не были предназначены для запуска в нем, не говоря уже о том, что производственная среда всегда является Linux. Разумеется, инструменты для разработчиков лучше подходят для Windows, поэтому для меня это «лучшее из обоих миров» (хотя инструменты Dev на стороне Mac хороши, OSX также не будет 1: 1 с рабочей средой Linux) , Поэтому я использую карту Samba и a good SSH client для всего остального, кроме операций Git write и визуальных Git diff (то есть для согласования конфликтов переустановки/слияния), которые невозможно выполнить из Windows по данной причине. Когда возникает необходимость выполнить diff, я перехожу к окну GUI Linux и выполняю там the Linux GUI diff tool of choice, а затем разрешения Linux обрабатываются правильно. В противном случае я управляю Git в командной строке с помощью SSH-клиента. У вас не может быть, например, IDE или клиент Windows Git (например, SourceTree), совершающий фиксацию в репо через Samba/CIFS; он будет работать неправильно. Для визуального клиента Git новый GitKraken - отличный выбор (он работает в графическом интерфейсе Linux).

В некоторых случаев вы можете обойти эту проблему с правами доступа к файлам, выполнив команду Git, игнорируя при этом права доступа к файлу (т.е. git -c core.fileMode=false), но я обнаружил, что быть грязным и привести к неприятностям, так что я только иногда использовать его для операций без записи, таких как git status, и есть Git псевдоним, определенный для этой цели:

nfm = "!f(){ git -c core.fileMode=false [email protected]; };f" 

Затем вы можете запустить команду Git с ядра.FileMode временно отключен, например, так:

git nfm status 

Добавлено 2016-05-07T01: 39: 44Z:

также видеть мою соответствующую должность в Superuser.

 Смежные вопросы

  • Нет связанных вопросов^_^