Jika Anda sedang mengalami masalah ini sekarang, saya baru saja mengalaminya hari ini dan dapat meringkas di mana ini berdiri. Jika Anda belum mencobanya, beberapa detail di sini mungkin bisa membantu.
Saya pikir pendekatan @Omid Ariyan adalah cara terbaik. Tambahkan skrip pra-komit dan pasca-pembayaran. JANGAN lupa untuk menamainya persis seperti yang dilakukan Omid dan JANGAN lupa untuk membuatnya dapat dieksekusi. Jika Anda lupa salah satunya, mereka tidak akan berpengaruh dan Anda menjalankan "git commit" berulang kali sambil bertanya-tanya mengapa tidak terjadi apa-apa :) Selain itu, jika Anda memotong dan menempelkan dari browser web, berhati-hatilah agar tanda kutip dan centang tidak diubah.
Jika Anda menjalankan skrip pra-komit satu kali (dengan menjalankan git komit), maka file .permissions akan dibuat. Anda dapat menambahkannya ke repositori dan menurut saya tidak perlu menambahkannya berulang kali di akhir skrip pra-komit. Tapi tidak ada salahnya, saya pikir (harapan).
Ada beberapa masalah kecil tentang nama direktori dan keberadaan spasi pada nama file di skrip Omid. Ruang adalah masalah di sini dan saya mengalami masalah dengan perbaikan IFS. Sebagai catatan, skrip pra-komit ini berfungsi dengan benar untuk saya:
#!/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"
Sekarang, apa yang kita dapatkan dari ini?
File .permissions ada di level teratas dari git repo. Ini memiliki satu baris per file, berikut adalah bagian atas contoh saya:
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
Seperti yang Anda lihat, kami punya
filepath;perms;owner;group
Dalam komentar tentang pendekatan ini, salah satu poster mengeluh bahwa itu hanya berfungsi dengan nama pengguna yang sama, dan itu secara teknis benar, tetapi sangat mudah untuk memperbaikinya. Perhatikan bahwa skrip pasca-pembayaran memiliki 2 bagian tindakan,
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
Jadi saya hanya menyimpan yang pertama, itu yang saya butuhkan. Nama pengguna saya di server Web memang berbeda, tetapi yang lebih penting Anda tidak dapat menjalankan chown kecuali Anda adalah root. Namun, dapat menjalankan "chgrp". Cukup jelas bagaimana menggunakannya.
Dalam jawaban pertama di posting ini, yang paling diterima secara luas, sarannya adalah gunakan git-cache-meta, skrip yang melakukan pekerjaan yang sama dengan yang dilakukan oleh skrip hook pra / posting di sini (parsing output dari git ls-files
) . Skrip ini lebih mudah untuk saya pahami, kode git-cache-meta agak lebih rumit. Dimungkinkan untuk menyimpan git-cache-meta di jalur dan menulis skrip pra-komit dan pasca-checkout yang akan menggunakannya.
Spasi dalam nama file merupakan masalah dengan kedua skrip Omid. Dalam skrip pasca-pembayaran, Anda akan tahu bahwa Anda memiliki spasi dalam nama file jika Anda melihat kesalahan seperti ini
$ 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
Saya sedang memeriksa solusi untuk itu. Ini sesuatu yang tampaknya berhasil, tetapi saya hanya menguji dalam satu kasus
#!/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
Karena informasi perizinan adalah satu baris pada satu waktu, saya menetapkan IFS ke $, jadi hanya jeda baris yang dilihat sebagai hal baru.
Saya membaca bahwa SANGAT PENTING untuk menyetel variabel lingkungan IFS kembali seperti semula! Anda dapat melihat mengapa sesi shell mungkin berjalan buruk jika Anda meninggalkan $ sebagai satu-satunya pemisah.