Saya ingin mengontrol versi server web saya seperti yang dijelaskan dalam Kontrol versi untuk server web saya , dengan membuat repo git dari file /var/www directory
. Harapan saya adalah saya kemudian dapat mendorong konten web dari server dev kami ke github, menariknya ke server produksi kami, dan menghabiskan sisa hari itu di pool.
Rupanya kekusutan dalam rencana saya adalah Git tidak akan menghormati izin file (saya belum mencobanya, hanya membaca tentangnya sekarang.) Saya rasa ini masuk akal karena kotak yang berbeda mungkin memiliki pengaturan pengguna / grup yang berbeda. Tetapi jika saya ingin memaksa izin untuk menyebar, mengetahui server saya dikonfigurasi sama, apakah saya punya pilihan? Atau adakah cara yang lebih mudah untuk mendekati apa yang saya coba lakukan?
sumber
Jawaban:
Yang
git-cache-meta
disebutkan dalam pertanyaan SO " git - bagaimana memulihkan hak akses file menurut git file itu? " (Dan FAQ git ) adalah pendekatan yang lebih tepat.Idenya adalah untuk menyimpan dalam sebuah
.git_cache_meta
file hak akses dari file dan direktori.Ini adalah file terpisah yang tidak diversi secara langsung di repo Git.
Itu sebabnya penggunaannya adalah:
Jadi kamu:
sumber
git ls-files
.Git adalah Sistem Kontrol Versi, dibuat untuk pengembangan perangkat lunak, jadi dari seluruh rangkaian mode dan izin hanya menyimpan bit yang dapat dieksekusi (untuk file biasa) dan bit symlink. Jika Anda ingin menyimpan izin penuh, Anda memerlukan alat pihak ketiga, seperti
git-cache-meta
( disebutkan oleh VonC ), atau Metastore (digunakan oleh etckeeper ). Atau Anda dapat menggunakan IsiSetup , yang IIRC menggunakan git sebagai backend.Lihat halaman Antarmuka, bagian depan, dan alat di Git Wiki.
sumber
/usr/share/git-core/contrib/hooks/setgitperms.perl
digit-contrib
paket saya-- skrip untuk tujuan serupa. ("Skrip ini dapat digunakan untuk menyimpan / memulihkan izin penuh dan data kepemilikan dalam pohon kerja git.")Ini cukup terlambat tetapi mungkin membantu beberapa orang lain. Saya melakukan apa yang ingin Anda lakukan dengan menambahkan dua kait git ke repositori saya.
.git / hooks / pre-commit:
.git / hooks / post-checkout:
Hook pertama dipanggil saat Anda "berkomitmen" dan akan membaca kepemilikan dan izin untuk semua file di repositori dan menyimpannya dalam file di root repositori yang disebut .permissions dan kemudian menambahkan file .permissions ke komit.
Hook kedua dipanggil saat Anda "checkout" dan akan memeriksa daftar file di file .permissions dan memulihkan kepemilikan dan izin file tersebut.
sumber
$SELF_DIR/../../
belum tentu root dari repositori ... tetapigit rev-parse --show-toplevel
adalah. (Tidak yakin mengapa Anda tidak hanya menggunakanpwd
untuk direktori saat ini, tapi itu tetap diperdebatkan.)IFS=$'\n'
sebelumfor
loop untuk menghentikannya (danunset IFS
setelah itu aman).chmod 0600 .pgpass
masukpost-checkout
. Ya, saya harus memperbaruinya secara manual setiap kali saya memiliki file yang memerlukan izin khusus, tetapi itulah jeda.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:
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:
Seperti yang Anda lihat, kami punya
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,
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
Saya sedang memeriksa solusi untuk itu. Ini sesuatu yang tampaknya berhasil, tetapi saya hanya menguji dalam satu kasus
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.
sumber
Kami dapat memperbaiki jawaban lain dengan mengubah format
.permissions
file menjadichmod
pernyataan yang dapat dieksekusi , dan menggunakan-printf
parameter kefind
. Ini.git/hooks/pre-commit
file yang lebih sederhana :... dan ini
.git/hooks/post-checkout
file yang disederhanakan :Ingatlah bahwa alat lain mungkin telah mengonfigurasi skrip ini, jadi Anda mungkin perlu menggabungkannya. Misalnya, berikut ini
post-checkout
skrip yang juga menyertakangit-lfs
perintah:sumber
Dalam pra-komit / pasca-checkout, opsi akan menggunakan "mtree" (FreeBSD), atau "fmtree" (Ubuntu) utilitas yang "membandingkan hierarki file dengan spesifikasi, membuat spesifikasi untuk hierarki file, atau memodifikasi spesifikasi."
Set default adalah flags, gid, link, mode, nlink, size, time, type, dan uid. Ini dapat dipasang untuk tujuan tertentu dengan sakelar -k.
sumber
Saya menjalankan FreeBSD 11.1, konsep virtualisasi jail freebsd membuat sistem operasi menjadi optimal. Versi Git yang saya gunakan saat ini adalah 2.15.1, saya juga lebih suka menjalankan semuanya pada skrip shell. Dengan pemikiran tersebut saya memodifikasi saran di atas sebagai berikut:
git push: .git / hooks / pre-commit
git pull: .git / hooks / post-merge
Jika karena alasan tertentu Anda perlu membuat ulang skrip, output file .permissions harus memiliki format berikut:
Untuk file .gitignore dengan 644 izin yang diberikan ke root: wheel
Perhatikan saya harus membuat beberapa perubahan pada opsi stat.
Nikmati,
sumber
Satu tambahan untuk jawaban @Omid Ariyan adalah perizinan pada direktori. Tambahkan ini setelah
for
loopdone
dipre-commit
skripnya.Ini akan menghemat izin direktori juga.
sumber