Periksa file Git ke lokasi di luar repositori

21

Apakah mungkin untuk "checkout" ke lokasi di luar repositori? Yang saya maksud adalah klon dari cabang tanpa direktori ".git".

Sebagai contoh: Gunakan git untuk mengelola situs web. Anda mengedit beberapa file, mengkomit dan menyalin file ke server web melalui WebDAV. WebDAV-path akan menjadi lokasi di luar repositori, yang seharusnya tidak mengandung ".git".

Ini mungkin bukan masalah yang dibangun git, tetapi apakah ini mungkin?

pengguna240826
sumber

Jawaban:

19

Ya, ini tentu saja mungkin.

Katakanlah saya memiliki repositori telanjang bernama /srv/production.gitpada sistem tujuan / server.

Pada sistem tujuan saya dapat menggunakan perintah cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

Jika saya di repositori non-telanjang, perintahnya sedikit berbeda. Katakanlah saya punya tempat penyimpanan yang tidak kosong di /srv/testing. Untuk checkout yang akan saya gunakancd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

Bahkan pada sistem saya, saya bahkan mengotomatiskan ini dalam post-commit hook di production.gitrepositori saya . Jadi ketika Anda mendorong ke production.gitversi terbaru secara otomatis memeriksa ke root web.

#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".

GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.

Jika satu-satunya akses Anda ke sistem jarak jauh adalah webdav, tentu saja dimungkinkan untuk menulis kait pasca-komit yang akan checkout ke host webdav, baik secara langsung atau ke lokasi sementara, yang kemudian dapat Anda skripkan unggahan.

Sakit kepala
sumber
dicari di banyak tempat .. hanya solusi yang berfungsi, juga bersih!
karthikeayan
6

Jika Anda hanya menginginkan file, Anda dapat menggunakan git archive. Biasanya ia menulis ke arsip seperti tarbal atau ZIP, tetapi Anda juga dapat mengirimnya melalui pipa:

git archive master | tar -x -C /some/path

Di sini, masterjelaslah cabang yang ingin Anda arsipkan, dan /some/pathhanya akan berisi file - tidak .gitatau .gitignore.


Atau Anda dapat menggunakan git checkout-indexyang lebih mirip dengan "checkout" file:

git checkout-index -f -a --prefix=/some/path/

Di sini, -aopsi memberi tahu gituntuk memeriksa semua file. Awalan akan didahului dengan output. Seseorang juga menulis pembungkus di sekitar ini untuk memberikan git export.

slhck
sumber
2
Saya pikir Anda membuat ini lebih sulit daripada yang seharusnya. Jalankan saja GIT_WORK_TREE=/destinationpath git checkout -fketika direktori Anda saat ini berada di atas repositori kosong, atau subdirektori .git. Anda akan mendapatkan checkout ke / destinationpath
Zoredache
Oke, entah bagaimana saya melewatkan opsi itu, +1 untuk Anda.
slhck
1
Saya menemukan opsi ini jauh lebih intuitif, jujur. Dan lebih sedikit kesalahan rawan.
Minix