В случае, если вы входите в это прямо сейчас, я только что прошел через это сегодня и могу подвести итог, где это стоит.Если вы еще не попробовали это, некоторые детали здесь могут помочь.
Я думаю, что подход @Omid Ariyan - лучший способ.Добавьте скрипты до и после оформления заказа.Не забудьте назвать их в точности так, как это делает Омид, и НЕ забудьте сделать их исполняемыми.Если вы забудете какой-либо из них, они не действуют, и вы снова и снова запускаете «git commit», удивляясь, почему ничего не происходит :) Также, если вы вырезаете и вставляете из веб-браузера, будьте осторожны, чтобы кавычки и галочки неизменено.
Если вы запустите скрипт предварительной фиксации один раз (запустив git commit), тогда будет создан файл .permissions.Вы можете добавить его в репозиторий, и я думаю, что нет необходимости добавлять его снова и снова в конце сценария предварительной фиксации.Но это не повредит, я думаю (надеюсь).
Есть несколько небольших проблем с именем каталога и наличием пробелов в именах файлов в скриптах Омида.Пространства были проблемой здесь, и у меня были некоторые проблемы с исправлением IFS.Напомним, что этот сценарий предварительной фиксации работал правильно для меня:
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
# Clear the permissions database file
> $DATABASE
echo -n "Backing-up file permissions..."
IFSold=$IFS
IFS=$'\n'
for FILE in `git ls-files`
do
# Save the permissions of all the files in the index
echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Add the permissions database file to the index
git add $DATABASE
echo "OK"
Теперь, что мы получим из этого?
Файл .permissions находится на верхнем уровне git-репо.Он имеет одну строку на файл, вот верхняя часть моего примера:
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
Как видите, у нас есть
filepath;perms;owner;group
В комментариях об этом подходе один изавторы жалуются, что он работает только с тем же именем пользователя, и это технически верно, но это очень легко исправить.Обратите внимание, что сценарий после оформления заказа состоит из двух частей:
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
Так что я оставляю только первый, это все, что мне нужно.Мое имя пользователя на веб-сервере действительно отличается, но что более важно, вы не можете запустить chown, если вы не являетесь пользователем root.Однако можно запустить "chgrp".Достаточно ясно, как это использовать.
В первом ответе в этом посте, наиболее широко принятом, предлагается использовать git-cache-meta, скрипт, который выполняетта же самая работа, которую здесь выполняют скрипты pre / post hook (парсинг вывода из git ls-files
).Мне проще понять эти скрипты, код git-cache-meta довольно сложный.Можно сохранить git-cache-meta в пути и написать сценарии предварительной фиксации и последующей проверки, которые будут его использовать.
Пробелы в именах файлов являются проблемой обоих сценариев Omid.В сценарии после оформления заказа вы будете знать, что в именах файлов есть пробелы, если вы видите такие ошибки
$ git checkout -- upload.sh
Restoring file permissions...chmod: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chmod: cannot access 'Notebook.onetoc2': No such file or directory
chown: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chown: cannot access 'Notebook.onetoc2': No such file or directory
Я проверяю решения для этого.Вот кое-что, что, кажется, работает, но я протестировал только в одном случае
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
echo -n "Restoring file permissions..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
FILE=`echo $LINE | cut -d ";" -f 1`
PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
USER=`echo $LINE | cut -d ";" -f 3`
GROUP=`echo $LINE | cut -d ";" -f 4`
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"
exit 0
Поскольку информация о разрешениях по одной строке за раз, я установил IFS на $, поэтому только разрывы строк рассматриваются как новыевещи.
Я читал, что ОЧЕНЬ ВАЖНО установить обратно переменную среды IFS, как это было!Вы можете понять, почему сеанс оболочки может работать плохо, если вы оставите $ в качестве единственного разделителя.