C'è un modo per impedire a git di cambiare permessi e proprietà su pull?


11

Ogni volta che lo faccio git pullo git reset, gitreimposta le modifiche alle autorizzazioni e alla proprietà che ho apportato. Vedi tu stesso:

#!/usr/bin/env bash
rm -rf 1 2

mkdir 1
cd 1
git init
echo 1 > 1 && git add 1 && git ci -m 1

git clone . ../2
cd $_
chmod 0640 1
chgrp http 1

cd ../1
echo 12 > 1 && git ci -am 2

cd ../2
stat 1
git pull
stat 1

Il risultato:

$ ./1.sh 2>/dev/null | grep -F 'Access: ('
Access: (0640/-rw-r-----)  Uid: ( 1000/    yuri)   Gid: (   33/    http)
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    yuri)   Gid: ( 1000/    yuri)

C'è un modo per aggirare il problema?

Voglio rendere alcuni file / directory accessibili per la scrittura dal server web.

Risposte:


4

Sembra che l'utente che stai utilizzando abbia il gruppo predefinito impostato su yuri. Puoi confermare in questo modo:

$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)

L'UID del tuo account è questo: uid=1000(saml)mentre il gruppo predefinito è git=1000(saml)e tutti i gruppi secondari sono in seguito.

NOTA: se si desidera che il clone git abbia una proprietà specifica, sono disponibili almeno 2 opzioni.

Opzione 1

Imposta una directory padre con le autorizzazioni che desideri in questo modo:

$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir

$ cd topdir
$ git clone ....

Ciò ha costretto la directory topdira imporre tutte le directory secondarie sottostanti per httpapplicare il gruppo . Funzionerà in generale, ma può portare a problemi, poiché se si spostano i file in questo spazio di lavoro del clone git, quei file non avranno i loro gruppi applicati dalle modifiche apportate sopra.

Opzione 2

Prima di fare un lavoro, cambia il tuo gruppo predefinito in questo httpmodo:

$ newgrp http
$ git clone ...

Questo metodo imporrà a tutti i nuovi file creati di impostare il proprio gruppo httpanziché il normale gruppo predefinito di yuri, ma funzionerà solo fintanto che si ricorda di fare un newgrplavoro precedente in questo spazio di lavoro.

Altre opzioni

Se nessuno di questi sembra accettabile, puoi provare a usare gli ACL invece nella directory dell'area di lavoro git. Questi sono discussi in più domande e risposte su questo sito, come in questa domanda e risposta intitolata: Ottenere nuovi file per ereditare le autorizzazioni di gruppo su Linux .


Innanzitutto, devi essere significativo newgrp. Quindi, cambia gruppo solo per la shell corrente? Infine, il punto era rendere accessibili solo i file / le directory specifici per la scrittura sul web server. Dopotutto, dovrei probabilmente risolverli manualmente o installare un githook ...
x-yuri,

@ x-yuri - sì scusa sono le 5 del mattino e sto per andare a letto Cool. Sì, questo persiste solo per l'attuale shell, quindi sarebbe un aspetto negativo di tale approccio. Se intendi solo un determinato accesso per il server web, questo sarà complicato e probabilmente vorrai utilizzare gli ACL. Inoltre, potresti voler aggiungere questi dettagli al tuo Q. Allo stato attuale, non è chiaro quale sia il tuo scopo previsto, quindi posso rispondere solo in termini non specifici.
slm

1
@ x-yuri - un hook di aggiornamento post come questo potrebbe essere più adatto: stackoverflow.com/questions/9613545/…
slm

1
@ x-yuri - i permessi di controllo sono discussi nel libro git sotto hook: git-scm.com/book/en/Customizing-Git-Git-Hooks
slm

In realtà non vedo come cambiare il gruppo solo per la shell corrente possa essere un aspetto negativo, a dire il vero. Ero preoccupato che non cambiasse il modo in cui funzionano le altre app.
x-yuri,

2

La soluzione che utilizzo è eseguire il comando come utente che dispone delle autorizzazioni che si desidera conservare:

sudo -u user command

Ciò impedisce alle autorizzazioni di cambiare. Lo uso quando aggiorno i repository git sul mio VPS, mantenendo le autorizzazioni dei file impostate per l'utente del server web.

Vedi anche la stessa domanda qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.