Я хочу управлять версиями своего веб-сервера, как описано в разделе Управление версиями для моего веб-сервера , путем создания репозитория git из моего /var/www directory
. Я надеялся, что тогда я смогу отправить веб-контент с нашего сервера разработки на github, перетащить его на рабочий сервер и провести остаток дня в пуле.
Очевидно, излом в моем плане состоит в том, что Git не будет уважать права доступа к файлам (я не пробовал, только сейчас читаю об этом). Я думаю, это имеет смысл, поскольку разные блоки могут иметь разные настройки пользователей / групп. Но если бы я хотел принудительно распространять разрешения, зная, что мои серверы настроены одинаково, есть ли у меня какие-либо варианты? Или есть более простой способ приблизиться к тому, что я пытаюсь сделать?
источник
Ответы:
git-cache-meta
Упоминаются в SO вопроса « мерзавец - как восстановить права доступа к файлам мерзавец посчитает файл должен быть » (и мерзавец FAQ ) является более staightforward подхода.Идея состоит в том, чтобы сохранить в
.git_cache_meta
файле права доступа к файлам и каталогам.Это отдельный файл, версия которого не контролируется непосредственно в репозитории Git.
Вот почему его используют:
Так что вы:
источник
git ls-files
.Git - это система контроля версий, созданная для разработки программного обеспечения, поэтому из всего набора режимов и разрешений она хранит только исполняемый бит (для обычных файлов) и бит символической ссылки. Если вы хотите сохранить полные разрешения, вам понадобится сторонний инструмент, например
git-cache-meta
( упомянутый VonC ) или Metastore (используемый etckeeper ). Или вы можете использовать IsiSetup , который IIRC использует git как бэкэнд.См. Страницу Интерфейсы, внешние интерфейсы и инструменты на Git Wiki.
источник
/usr/share/git-core/contrib/hooks/setgitperms.perl
в своемgit-contrib
пакете - скрипт для той же цели. («Этот сценарий можно использовать для сохранения / восстановления полных разрешений и данных о владении в рабочем дереве git.»)Это довольно поздно, но может помочь некоторым другим. Я делаю то, что вы хотите, добавляя в свой репозиторий два крючка git.
.git / крючки / предварительная фиксация:
.git / hooks / после оформления заказа:
Первый перехватчик вызывается, когда вы «коммитируете», и он считывает права собственности и разрешения для всех файлов в репозитории и сохраняет их в файле в корне репозитория с именем .permissions, а затем добавляет файл .permissions в коммит.
Вторая ловушка вызывается, когда вы "оформляете заказ", и просматривает список файлов в файле .permissions и восстанавливает права собственности и права доступа к этим файлам.
источник
$SELF_DIR/../../
не обязательно является корнем репозитория ... ноgit rev-parse --show-toplevel
есть. (Не уверен, почему бы вам просто не использоватьpwd
текущий каталог, но это все равно спорный.)IFS=$'\n'
передfor
циклом, чтобы остановить это (аunset IFS
затем, чтобы быть в безопасности).chmod 0600 .pgpass
дюймаpost-checkout
. Да, мне придется обновлять его вручную всякий раз, когда у меня есть файл, требующий определенных разрешений, но это перерывы.Если вы подумываете об этом прямо сейчас, я только что прошел через это сегодня и могу резюмировать, где это стоит. Если вы еще не пробовали это сделать, некоторые подробности здесь могут помочь.
Я думаю, что подход @Omid Ariyan - лучший способ. Добавьте сценарии до фиксации и после оформления заказа. НЕ забывайте называть их точно так, как это делает Омид, и НЕ забывайте делать их исполняемыми. Если вы забудете одно из них, они не возымеют никакого эффекта, и вы снова и снова будете запускать команду «git commit», задаваясь вопросом, почему ничего не происходит :) Кроме того, если вы вырезаете и вставляете из веб-браузера, будьте осторожны, чтобы кавычки и галочки не были изменено.
Если вы запустите сценарий предварительной фиксации один раз (запустив команду git commit), будет создан файл .permissions. Вы можете добавить его в репозиторий, и я думаю, нет необходимости добавлять его снова и снова в конце сценария перед фиксацией. Но не больно, думаю (надеюсь).
Есть несколько небольших проблем с именем каталога и наличием пробелов в именах файлов в сценариях Omid. Пробелы здесь были проблемой, и у меня были проблемы с исправлением IFS. Для записи, этот сценарий предварительной фиксации действительно работал у меня правильно:
Что мы получаем из этого?
Файл .permissions находится на верхнем уровне репозитория git. В нем одна строка на файл, вот верхняя часть моего примера:
Как видите, у нас есть
В комментариях к этому подходу один из плакатов жалуется, что он работает только с тем же именем пользователя, и это технически верно, но это очень легко исправить. Обратите внимание на то, что скрипт после оформления заказа состоит из двух частей:
Так что я оставлю только первую, это все, что мне нужно. Мое имя пользователя на веб-сервере действительно другое, но, что более важно, вы не можете запускать chown, если не являетесь пользователем root. Однако может запускать "chgrp". Достаточно ясно, как это использовать.
В первом ответе в этом сообщении, наиболее широко принятом, предлагается использовать git-cache-meta, скрипт, который выполняет ту же работу, что и скрипты pre / post hook здесь (анализ вывода из
git ls-files
) . Эти сценарии мне легче понять, код git-cache-meta более сложен. Можно сохранить git-cache-meta в пути и написать сценарии до фиксации и после проверки, которые будут его использовать.Пробелы в именах файлов - проблема обоих скриптов Омида. В сценарии после оформления заказа вы будете знать, что у вас есть пробелы в именах файлов, если вы увидите такие ошибки
Я ищу решения для этого. Вот кое-что, что, кажется, работает, но я тестировал только в одном случае
Поскольку информация о разрешениях выводится по одной строке за раз, я устанавливаю IFS на $, поэтому только разрывы строк воспринимаются как новые вещи.
Я читал, что ОЧЕНЬ ВАЖНО вернуть переменную среды IFS в прежнее состояние! Вы можете понять, почему сеанс оболочки может закончиться неудачно, если вы оставите $ в качестве единственного разделителя.
источник
Мы можем улучшить другие ответы, изменив формат
.permissions
файла, который будет исполняемымиchmod
операторами, и использовать-printf
параметр дляfind
. Вот более простой.git/hooks/pre-commit
файл:... и вот упрощенный
.git/hooks/post-checkout
файл:Помните, что другие инструменты могли уже настроить эти сценарии, поэтому вам может потребоваться объединить их вместе. Например, вот
post-checkout
сценарий, который также включаетgit-lfs
команды:источник
При предварительной фиксации / после оформления заказа можно использовать утилиту «mtree» (FreeBSD) или «fmtree» (Ubuntu), которая «сравнивает файловую иерархию со спецификацией, создает спецификацию для файловой иерархии или изменяет Технические характеристики."
По умолчанию установлены флаги, gid, ссылка, режим, nlink, размер, время, тип и uid. Это можно настроить для конкретной цели с помощью переключателя -k.
источник
Я работаю на FreeBSD 11.1, концепция виртуализации тюрьмы freebsd делает операционную систему оптимальной. Текущая версия Git, которую я использую, - 2.15.1, я также предпочитаю запускать все на сценариях оболочки. Имея это в виду, я изменил приведенные выше предложения следующим образом:
git push: .git / крючки / предварительная фиксация
git pull: .git / hooks / после слияния
Если по какой-то причине вам нужно воссоздать скрипт, выходной файл .permissions должен иметь следующий формат:
Для файла .gitignore с 644 разрешениями, предоставленными root: wheel
Обратите внимание, мне пришлось внести несколько изменений в параметры статистики.
Наслаждаться,
источник
Одно из дополнений к ответу @Omid Ariyan - это разрешения на каталоги. Добавьте это после
for
циклаdone
в егоpre-commit
скрипт.Это также сохранит права доступа к каталогу.
источник