2012-03-08 18 views
5

stworzyłem gołego repo @jak kontrolować własność plików automatycznie pchanych do repozytorium git za pomocą haków commitów?

/srv/repos/test 

mogę ustawić własności do wwwrun: www z SUID + bitów GUID ustawić

chown -R wwwrun:www /srv/repos/hub 
chmod ug+s   /srv/repos/hub 
ls -ald /srv/repos/test 
    drwsrws---+ 10 wwwrun www 4.0K Mar 7 21:28 /srv/repos/hub/ 

i sklonowany repo do Webroot i zmieniła swoją własność,

git clone /srv/repos/hub /srv/www/siteA 
chown -R wwwrun:www  /srv/www/siteA 

dla wygody zdefiniować zdalne

cd /srv/www/siteA 
git remote add HUB /srv/repos/hub 

następnie utworzyć post-commit i po aktualizacji haki do przechowywania rzeczy w synchronizacji,

vi /srv/www/siteA/.git/hooks/post-commit 
    #!/bin/sh 
    git push HUB 

vi /srv/repos/hub/hooks/post-update 
    #!/bin/sh 
    cd /srv/www/siteA || exit 
    unset GIT_DIR 
    git pull HUB master 
    exec git-update-server-info 

jak mój zwykły użytkownik, i kasa HUB

whoami 
    locuse 
cd ~ 
git clone /srv/repos/hub WORK 
ls -ald WORK 
    drwxr-xr-x 10 locuse users 4.0K Mar 7 21:44 WORK/ 

dokonać zmiany, popełnić i pchania,

cd WORK 
touch touch_file 
ls -al touch_file 
    -rw-r--r-- 1 locuse users 0 Mar 7 21:44 touch_file 
git add -A 
git commit -m "add test" 
git push 

następnie sprawdzając, że hak zwolniony, a zmiana została przesunięta do webroot,

plik tam - zgodnie z oczekiwaniami.

, ale nie jest to własność użytkownika, której chcę, a mianowicie to użytkownik = 'locuse', a nie user = 'wwwrun'.

w tym konkretnym przypadku użytkowej, co jest właściwym sposobem, aby upewnić się, że zamiast tego, by zawsze automatycznie kończy-up z,

ls -al /srv/www/siteA/touch_file 
    -rw-rw----+ 1 wwwrun www 0 Mar 7 21:45 /srv/www/siteA/touch_file 

? tzn. wszystko zawsze jest promowane do/srv/www/siteA tylko jako wwwrun: www.

coś w haku, zgaduję?

wiem, że można dodać

chown -R wwwrun:www /srv/www/siteA 

do post-commit, który działa dobrze dla małego drzewa, ale torfowiska na każdym popełnić/aktualizację w dół, jeśli jest duża (co to będzie).

może, gdybym mógł efektywnie nadążyć za bieżącym zatwierdzeniem ...?

+0

proszę umieścić rozwiązanie w odpowiedzi. W odpowiednim czasie możesz zaakceptować odpowiedź. –

+0

w czasie, kiedy to edytowałem, nie pozwalało mi tego robić, oczekując jeszcze 6 godzin ... –

Odpowiedz

7

to działa,

vi /srv/repos/hub/hooks/post-update 
    #!/bin/sh 
    cd /srv/www/siteA || exit 
    unset GIT_DIR 
- git pull HUB master 
+ git fetch HUB master 
+ files=`git diff ..FETCH_HEAD --name-only --diff-filter=ACMRTUXB` 
+ git merge FETCH_HEAD 
+ for file in $files 
+ do 
+  sudo chown wwwrun:www $file 
+ done 
    exec git-update-server-info 

chown execs tylko na plikach zidentyfikowane jako zestaw w commit - małe & szybko.

2

Miałem ten sam problem i po pewnych badaniach odkryłem, że nie ma rozwiązania, jeśli zaktualizujesz repozytorium (HUB) przez SSH, ponieważ haki są wykonywane przez użytkownika, który podłączył się do repozytorium HUB (w nasz przypadek git). Jeśli chcesz uniknąć wydawania komendy chown/chmod dla użytkownika git (problem bezpieczeństwa), jedynym rozwiązaniem jest utworzenie zadania cron, aby zaktualizować repo. Zrobiłem ten skrypt (mój pierwszy skrypt bash) zmieniające starą i dodając także powiadomienia e-mail o udanym aktualizacji:

#!/bin/sh 
# web repository directory 
REPO_DIR="/srv/www/siteA" 
# remote repository 
REMOTE_REPO="HUB" 
# public branch of the remote repository (only this branch well be public accessible trough the web server) 
REMOTE_REPO_BRANCH="master" 
# email address where receive notification 
EMAIL_TO="[email protected]" 
# sender email address and name 
SENDER_ADDR="[email protected]" 
SENDER_NAME="sender name" 
# tmp file that contain email body 
TMP_MSG_FILE="emailmessage.txt" 

cd $REPO_DIR || exit 
unset GIT_DIR 
echo "fetching changes..." 
git fetch $REMOTE_REPO $REMOTE_REPO_BRANCH 
files=`git diff ..FETCH_HEAD --name-only --diff-filter=ACDMRTUXB` 
if [[ -n $files ]]; then 
echo "changes found for the following file:" 
echo ${files[*]} 
echo "merging changes" 
git merge FETCH_HEAD 
echo "sending email" 
SUBJECT="GIT: Web Directory Updated" 
TMP_MSG_FILE="emailmessage.txt" 
echo "following file are been updated/created/deleted: "> $TMP_MSG_FILE 
echo ${files[*]} >>$TMP_MSG_FILE 
echo "Working directory:" >>$TMP_MSG_FILE 
echo "$repo_dir" >>$TMP_MSG_FILE 
mutt -e "unmy_hdr from; my_hdr From: $SENDER_ADDR" -e "set realname='$SENDER_NAME' " -s "$SUBJECT" $EMAIL_TO < $TMP_MSG_FILE 
else 
echo "no changes found" 
fi 
Powiązane problemy