Saya mengalami masalah yang sama dengan situs yang saya host-kan pada paket hosting berbagi HostNine. Mereka juga memberi Anda ssh
akses, tetapi sayangnya mereka belum git
diinstal dan bahkan tidak memberi Anda akses untuk menjalankan gcc
, membuatnya agak sulit untuk mengunduh dan menginstal git untuk pengguna Anda.
Satu-satunya cara saya bisa memikirkan untuk mengatasi pembatasan ini adalah dengan menyalin binari git dari komputer lain yang memilikinya. Mungkin solusi yang sama akan bekerja untuk Anda dan host bersama GoDaddy Anda. Inilah yang saya lakukan:
Pertama cari tahu apa arsitektur server Anda. Dalam kasus saya itu 32-bit (i386). Berikut adalah beberapa cara untuk mengetahuinya:
# uname -a
Linux ___.myserverhosts.com 2.6.18-128.1.6.el5PAE #1 SMP Wed Apr 1 10:02:22 EDT 2009 i686 i686 i386 GNU/Linux
# file /bin/echo
/bin/echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
Selanjutnya Anda perlu menemukan komputer lain yang menjalankan Linux dengan arsitektur yang sama dan dengan git diinstal di dalamnya. Mereka bahkan tidak harus menjalankan distribusi atau versi Linux yang sama, asalkan arsitekturnya sama dan Anda dapat menemukan file biner dan pustaka yang Anda butuhkan.
Untuk menemukan lokasi biner git utama:
> which git
/usr/local/bin/git
Beberapa binari penting lainnya (seperti git-receive-pack
) juga berada di direktori yang sama, jadi saya sarankan hanya menyalin semua /usr/local/bin/git*
untuk memastikan Anda mendapatkan semua yang Anda butuhkan.
File-file penting lainnya adalah git yang bergantung pada direktori 'libexec' di suatu tempat di sistem sumber. Jika Anda tidak menyalin ini, Anda mungkin mendapatkan pesan kesalahan yang mengejutkan ketika Anda mencoba melakukan git push
, seperti yang saya lakukan:
git: 'index-pack' is not a git-command. See 'git --help'.
Untuk menemukan direktori yang berisi pustaka inti git di target_host, Anda dapat menggunakan ini:
> git --exec-path
/usr/local/libexec/git-core
Saya akan merekomendasikan menyalin file-file itu terlebih dahulu dan kemudian mencoba menjalankan git untuk melihat apakah ia mengeluh tentang ada pustaka bersama yang hilang. Jika tidak, maka Anda (mungkin) baik untuk pergi. Jika ya, maka teruslah membaca. (Tidak digunakan menyalin di perpustakaan bersama jika sudah ada pada host target dan merupakan versi yang benar.)
Anda dapat menyalin file dengan scp
, rsync
, ftp
, atau apapun yang Anda merasa nyaman dengan. Saya menggunakan scp
, sesuatu seperti ini:
> ssh target_host 'mkdir -p ~/bin ~/libexec'
> scp /usr/local/bin/git* target_host:~/bin
> scp -r /usr/local/libexec/git-core target_host:~/libexec
Kemudian ssh ke target_host. Anda perlu menambahkan beberapa baris seperti ini ke ~/.bashrc
:
export PATH=$PATH:~/bin
export LD_LIBRARY_PATH=~/lib
export GIT_EXEC_PATH=~/libexec/git-core
Jika Anda lupa langkah ini, Anda mungkin terkejut melihat kesalahan ini ketika Anda melakukan git push
:
git-receive-pack: command not found
Ini didokumentasikan pada FAQ Git di git.or.cz:
Pada dasarnya masalahnya adalah bahwa 'git-accept-pack' tidak dalam $ PATH default pada ujung jarak jauh.
...
- Memastikan Anda memiliki jalur yang benar disiapkan
.bashrc
(tidak hanya .bash_profile
)
GIT_EXEC_PATH
didokumentasikan pada man git
:
--exec-path
Path to wherever your core git programs are installed.
This can also be controlled by setting the GIT_EXEC_PATH
environment variable. If no path is given, git will print
the current setting and then exit.
Sumber baru Anda ~/.bashrc
. Sekarang coba jalankan git
.
Inilah yang memberi saya pertama kali:
> git
git: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
Saya dapat mengetahui lokasi pustaka bersama untuk disalin dengan menjalankan ini pada mesin sumber:
> ldd /usr/local/bin/git
libz.so.1 => /usr/lib/libz.so.1 (0xb7fcf000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0xb7ee4000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7ed2000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7da6000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb7d92000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb7d2d000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0xb7d2a000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7d08000)
libresolv.so.2 => /lib/libresolv.so.2 (0xb7cf5000)
libdl.so.2 => /lib/libdl.so.2 (0xb7cf1000)
/lib/ld-linux.so.2 (0xb7fe8000)
Dalam kasus saya, saya hanya perlu menyalin /lib/libcrypto.so.4
ke ~/lib
saya target_host
dan semuanya baik-baik saja.
Sekarang Anda harus sudah bekerja git
pada server hosting bersama Anda dan Anda harus bisa mendorongnya!
Sekarang Anda perlu membuat repositori git baru dan pohon kerja di server Anda atau menyalin pohon repositori / kerja Anda yang sudah ada.
By the way, saya tidak berpikir repositori telanjang adalah apa yang Anda inginkan di server dalam hal ini karena Anda mengatakan Anda ingin menyebarkan file konten aktual (bukan hanya config HEAD objects/ refs/
file yang akan dimasukkan dalam repositori telanjang) kapan saja kamu melakukan git push
.
toolmantim.com menjelaskan perbedaan antara repositori git biasa dan repositori kosong:
Repositori git default mengasumsikan bahwa Anda akan menggunakannya sebagai direktori kerja Anda, jadi git menyimpan file repositori telanjang yang sebenarnya di direktori .git di samping semua file proyek. Repositori jarak jauh tidak memerlukan salinan file pada sistem file tidak seperti copy pekerjaan, yang mereka butuhkan hanyalah delta dan biner yang tidak dimiliki repositori itu sendiri. Inilah yang "telanjang" artinya git. Hanya repositori itu sendiri.
Saya akan berasumsi untuk saat ini bahwa Anda telah membuat direktori di target_host
mana Anda ingin menyebarkan situs web Anda (atau apa pun yang Anda gunakan). Mari kita sebut direktori itu ~/www/my_site
. Anda bahkan mungkin ftp'd atas semua file Anda ~/www/my_site already
. (Apakah Anda memiliki atau tidak adalah tidak penting.) Saya juga akan berasumsi untuk saat ini bahwa Anda belum menyalin subdirektori .git ke ~/www/my_site
(seharusnya berfungsi dengan baik jika Anda memilikinya).
Karena belum ada repositori git yang diinisialisasi pada target_host, langkah pertama Anda adalah membuatnya:
> cd ~/www/my_site
> git init
Kemudian dari host mana pun yang memiliki repositori dengan perubahan terbaru yang ingin Anda gunakan (kotak pengembangan Anda, saya kira), Anda hanya perlu melakukan sesuatu seperti ini untuk menggunakan:
> git push --all ssh://username@target_host:port/~/www/my_site/.git
Anda mungkin melihat peringatan seperti ini jika repositori Anda pada tanggal target_host
belum diperbarui:
> warning: updating the current branch
> warning: Updating the currently checked out branch may cause confusion,
> warning: as the index and work tree do not reflect changes that are in HEAD.
> warning: As a result, you may see the changes you just pushed into it
> warning: reverted when you run 'git diff' over there, and you may want
> warning: to run 'git reset --hard' before starting to work to recover.
> warning:
> warning: You can set 'receive.denyCurrentBranch' configuration variable to
> warning: 'refuse' in the remote repository to forbid pushing into its
> warning: current branch.
> warning: To allow pushing into the current branch, you can set it to 'ignore';
> warning: but this is not recommended unless you arranged to update its work
> warning: tree to match what you pushed in some other way.
> warning:
> warning: To squelch this message, you can set it to 'warn'.
> warning:
> warning: Note that the default will change in a future version of git
> warning: to refuse updating the current branch unless you have the
> warning: configuration variable set to either 'ignore' or 'warn'.
(Dalam git
penggunaan normal, Anda tidak pernah melihat pesan itu, saya pikir, karena Anda biasanya mendorong untuk membuka repositori. Tetapi karena repositori jarak jauh kami dalam kasus ini adalah repo normal dengan pohon kerja dan indeks, git
dapat dimengerti khawatir bahwa itu mungkin mengacaukan sesuatu.)
Saya pikir aman bagi kami untuk mengaturnya agar 'diabaikan' di server Anda, karena Anda tidak mungkin membuat komitmen langsung ke repositori di sana. (Semua komit mungkin seharusnya berasal dari repositori pengembangan Anda dan kemudian didorong ke server.)
Jadi lanjutkan dan atur ini sehingga Anda tidak akan melihat peringatan setiap kali Anda mendorong:
> ssh target_host 'cd ~/www/my_site/; git config receive.denyCurrentBranch ignore'
Itu push
sendiri hanya memperbarui indeks, BUKAN file di pohon pekerjaan itu sendiri. Memperbarui file-file itu hanya semacam inti dari apa yang kami coba lakukan, jadi tugas kami belum selesai sampai kami meminta git
untuk menuliskan isi indeks ke pohon pekerjaan itu sendiri, seperti:
> ssh target_host 'cd ~/www/my_site/; git reset --hard'
(Catatan: Setiap perubahan yang mungkin Anda miliki di pohon pekerjaan Anda di server akan ditimpa oleh apa yang ada di repositori.)
Saya juga mengikuti saran mattikus dan membuat remote untuk server saya:
> git remote add h9 ssh://username@target_host:port/~/www/my_site/.git
Jadi sekarang yang harus saya lakukan untuk menggunakan adalah:
> git push --all --force h9
> ssh remote_host 'cd ~/www/my_site/; git reset --hard'
Saya bahkan melangkah lebih jauh dengan melempar perintah-perintah ini dalam sebuah skrip yang saya beri nama script/deploy
sehingga setiap kali saya ingin menggunakan saya hanya memiliki satu perintah untuk dijalankan.
Tolong beri tahu saya jika Anda menemukan kesalahan dalam instruksi ini atau jika Anda tahu solusi yang lebih baik.