Şu anda bu konuya giriyorsanız, ben bugün bunun üzerinden geçtim ve bunun nerede durduğunu özetleyebilirim. Bunu henüz denemediyseniz, buradaki bazı ayrıntılar yardımcı olabilir.
@Omid Ariyan'ın yaklaşımının en iyi yol olduğunu düşünüyorum. Ön işlem ve ödeme sonrası komut dosyalarını ekleyin. Onları tam olarak Omid'in yaptığı gibi adlandırmayı ve çalıştırılabilir hale getirmeyi UNUTMAYIN. Bunlardan herhangi birini unutursanız, hiçbir etkisi olmaz ve neden hiçbir şey olmadığını merak ederek "git commit" i tekrar tekrar çalıştırırsınız :) Ayrıca, web tarayıcısından kesip yapıştırırsanız, tırnak işaretlerinin ve tiklerin olmamasına dikkat edin. değişmiş.
Pre-commit komut dosyasını bir kez çalıştırırsanız (bir git commit çalıştırarak), o zaman .permissions dosyası oluşturulur. Onu arşive ekleyebilirsiniz ve bence bunu ön-kaydetme betiğinin sonuna tekrar tekrar eklemenin gereksiz olduğunu düşünüyorum. Ama acıtmıyor, bence (umut).
Omid'in komut dosyalarında dizin adı ve dosya adlarında boşlukların varlığı hakkında birkaç küçük sorun vardır. Boşluklar burada bir sorundu ve IFS düzeltmesiyle ilgili bazı sorunlar yaşadım. Kayıt için, bu ön işleme betiği benim için doğru çalıştı:
#!/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"
Şimdi, bundan ne çıkaracağız?
.Permissions dosyası git deposunun en üst düzeyindedir. Dosya başına bir satırı var, işte örneğimin en üstünde:
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
Gördüğünüz gibi bizde
filepath;perms;owner;group
Bu yaklaşımla ilgili yorumlarda, bir posterin yalnızca aynı kullanıcı adıyla çalıştığından ve bunun teknik olarak doğru olduğundan, ancak düzeltmenin çok kolay olduğundan şikayet ediyor. Ödeme sonrası komut dosyasının 2 işlem parçası olduğunu unutmayın,
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
Bu yüzden sadece ilkini saklıyorum, tek ihtiyacım olan bu. Web sunucusundaki kullanıcı adım gerçekten farklı, ancak daha da önemlisi, root değilseniz chown'u çalıştıramazsınız. Ancak "chgrp" çalıştırabilir. Bunun nasıl kullanılacağı yeterince açık.
Bu gönderideki ilk cevapta, en yaygın olarak kabul edilen öneri, buradaki ön / son kanca komut dosyalarının yaptığı işi yapan bir komut dosyası olan git-cache-meta'yı kullanmaktır (çıktının ayrıştırılması git ls-files
) . Bu komut dosyalarını anlamak benim için daha kolay, git-cache-meta kodu oldukça ayrıntılı. Git-cache-meta'yı yolda tutmak ve onu kullanacak pre-commit ve post-checkout betikleri yazmak mümkündür.
Dosya adlarındaki boşluklar Omid'in her iki komut dosyasıyla ilgili bir sorundur. Kontrol sonrası komut dosyasında, bunun gibi hatalar görürseniz dosya adlarında boşluklar olduğunu anlarsınız.
$ 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
Bunun için çözümleri kontrol ediyorum. İşte işe yarayan bir şey var, ancak yalnızca bir durumda test ettim
#!/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
İzin bilgileri her seferinde bir satır olduğundan, IFS'yi $ olarak ayarladım, bu nedenle yalnızca satır sonları yeni şeyler olarak görülüyor.
IFS ortam değişkenini eski haline getirmenin ÇOK ÖNEMLİ olduğunu okudum! $ Tek ayırıcı olarak bırakırsanız, kabuk oturumunun neden kötü gidebileceğini görebilirsiniz.