mendapatkan "fatal: bukan repositori git: '.'" saat menggunakan hook pasca-pembaruan untuk mengeksekusi 'git pull' pada repo lain

90

Saya baru mengenal git jadi saya minta maaf (dan mohon koreksi saya) jika saya menyalahgunakan terminologi di sini, tapi saya akan melakukan yang terbaik.

Saya mencoba menyiapkan repo git kosong (hub) dan salinan pekerjaan situs pengembangan (prime) di server web. Saya sudah mencoba membuat pola setelah artikel ini . Saya ingin copy pekerjaan pengembangan diperbarui setiap kali repo hub didorong ke. Saya mendapat kesan bahwa pengait yang tepat untuk ini adalah post-update, yang telah saya buat seperti ini:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

Memperbarui

Ketika saya mendorong perubahan dari repo lokal saya ke hub kosong, saya mendapatkan output berikut dari skrip pasca-pembaruan:

remote: sites
remote: fatal: Not a git repository: '.'

Namun jika saya SSH ke server sebagai 'situs' pengguna dan mengeksekusi skrip ini secara manual, itu berfungsi dengan baik. Ada ide tentang apa yang mungkin salah dengan hook atau skrip ini?

Ty W
sumber

Jawaban:

179

Inilah skrip yang akhirnya berhasil. Saya pikir sedikit yang awalnya saya lewatkan yang mencegahnya bekerja dari jarak jauh adalahunset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info
Ty W
sumber
18
Saya dapat mengonfirmasi, tidak menyetel GIT_DIRperbaikan masalah.
jmtd
16
Bagi mereka yang mau mengerti mengapa: itu karena git menggunakan variabel GIT_DIRdaripada PWD. cd-ing mengubah PWDbukan GIT_DIR. Harus ada penggantian dalam git dari GIT_DIRmenjadi PWDjika yang pertama tidak tersedia.
zupa
Pertanyaannya adalah mengapa git melihatnya perlu melakukan ini untuk skrip hook (setel GIT_DIR sehingga skrip yang memiliki 'cd' di tempat lain 'git anything' akan tetap berfungsi)? Saya pribadi akan memilih bahwa git tidak melakukan sihir semacam ini.
Steven Haryanto
2
Alasan di balik ini adalah karena Git menerapkan beberapa variabel lingkungan ke semua perintah inti git.
Casey
Apa yang terjadi jika ada konflik penggabungan setelahnya git pull?
lolololol ol
29

Coba saja:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Geraldo Luis da Silva Ribeiro
sumber
0

Meskipun begitu, GIT_DIR yang tidak disetel hanya berfungsi.

masalah terjadi ketika Anda salah menyetel GIT_DIR di tempat lain.

Anda dapat menambahkannya sebagai gantinya: GIT_DIR = .git / Ini akan berhasil

Zvika Naveh
sumber
0

Dalam kasus saya, saya telah menentukan pohon kerja, dan ini merusak beberapa perintah, seperti pull(atau lebih tepatnya fetch).

Untuk membatalkan pengaturan pohon kerja jika itu ada di konfigurasi git Anda adalah melalui:

git config --unset core.worktree

(Ada cara lain untuk mengatur pohon kerja)

Perlu diperhatikan,

Hampir tidak ada perubahan dari ini menjadi masalah Anda kecuali Anda sendiri menggali lubang ini di sekitar Anda dengan menggunakan pohon kerja khusus di tempat pertama.

Kelakar:

Ini menyiratkan kepada saya bahwa git internal menggunakan jalur relatif terhadap worktree + .git/dalam beberapa kasus. Menurut pengalaman saya, pohon kerja tidak didukung dengan baik sama sekali, kecuali oleh bagian paling mendasar dari git. Saya belum bereksperimen secara menyeluruh, Git mungkin akan berperilaku jika saya menyetel variabel konfigurasi direktori git apa pun dengan benar, yang belum pernah saya mainkan.

ThorSummoner
sumber
-1

Anda mungkin mengalami masalah izin. Saya tidak yakin bagaimana Anda menyiapkan repo git telanjang Anda, tetapi jika dijalankan di bawah gitpengguna, pastikan bahwa gitpengguna diizinkan untuk melakukan git pulldi direktori proyek Anda.

Secara opsional, coba ini untuk mencari tahu pengguna apa Anda saat hook dijalankan:

echo `whoami`
Ariejan
sumber
jika saya ssh ke server sebagai pengguna git, saya dapat menggunakan git pull di direktori proyek saya tanpa masalah. Saya yakin bahwa pengguna itulah yang seharusnya menjalankan skrip. Saya dapat mencoba menambahkan baris whoami ke skrip, tetapi ke mana output dari skrip itu pergi ketika dieksekusi sebagai hook? Mungkin saya perlu mengirim keluaran itu ke file log alih-alih menggema?
Ty W
Apa echo `whoami`yang whoamitidak?
Christoffer Hammarström
Output ke stdout dari skrip hook terlihat oleh remote yang melakukan tindakan. Atau, dengan kata lain, jika Anda mengucapkan 'git push', keluaran dari hook pada remote akan muncul di stdout Anda.
ebneter
ya, perhatikan itu saat saya bermain dengan barang-barang. sangat nyaman :)
Ty W