Menyiapkan repo git pada paket hosting GoDaddy saya

14

Saya punya proyek yang dikendalikan versi menggunakan git.

Apa yang ingin saya lakukan adalah menyiapkan repo pada paket hosting bersama GoDaddy (ssh-enabled) saya sehingga saya bisa menggunakan dengan push daripada menyeret dan menjatuhkan di FTP.

Setiap tips akan sangat dihargai. Best akan menjadi akun dari seseorang yang sudah melakukannya, tetapi saya tidak bisa menemukan sendiri secara online.

Tom Wright
sumber
Anda mungkin akan mendapatkan jawaban yang lebih baik tentang ini dari StackOverflow
mrTomahawk
Ya, itu adalah pertarungan di antara keduanya. Mungkin coba lintas posting itu. Terima kasih.
Tom Wright
Bukannya saya sudah menyiapkan git repo, tetapi bagaimana cara mengatur pemrograman kode sumber server? - Pilihan saya adalah untuk serverfault, jelas
serverhorror
1
Mungkin tidak, tetapi pengembang akan tahu tentang itu, karena mereka tidak mungkin mempercayai kami untuk mengaturnya.
tomjedrz
1
Tentu saja tomjedrz, dan demi kelengkapan: stackoverflow.com/questions/1003885/…
Tom Wright

Jawaban:

23

Saya mengalami masalah yang sama dengan situs yang saya host-kan pada paket hosting berbagi HostNine. Mereka juga memberi Anda sshakses, tetapi sayangnya mereka belum gitdiinstal 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_PATHdidokumentasikan 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.4ke ~/libsaya target_hostdan semuanya baik-baik saja.


Sekarang Anda harus sudah bekerja gitpada 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_hostmana 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_hostbelum 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 gitpenggunaan 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, gitdapat 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 pushsendiri 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 gituntuk 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/deploysehingga 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.

Tyler Rick
sumber
Luar biasa! Saya akan +10 untuk usaha jika memungkinkan.
icc97
2

Saya sama-sama seorang SF dan GoDaddy n00b, jadi bersabarlah, tapi bagaimanapun, saya sangat senang melihat ini dibahas di sini.

Hanya $ 0,02 saya, saya mencoba membangun git (secara dinamis) pada kotak linux saya, menyalurkannya ke akun gaduh saya, dan bahkan jika hanya mencoba untuk mendorong ke mesin gaduh yang pasif, ia gagal karena hilang openssl. Mungkin jika saya mencoba membangun git secara statis dengan openssl, tapi rasanya juga ide yang buruk.

$ git remote add godaddy ssh://[email protected]//home/content/u/n/c/unclecj/foo.git

$ git push godaddy master
bash: git-receive-pack: command not found
fatal: The remote end hung up unexpectedly

$ git push --receive-pack="/home/content/u/n/c/unclecj/opt/git-1.6.3/bin/git-receive-pack" godaddy master
/home/content/u/n/c/unclecj/opt/git-1.6.3/bin/git-receive-pack: error while loading shared libraries: libcrypto.so.0.9.8: cannot open shared object file: No such file or directory
fatal: The remote end hung up unexpectedly

Di luar topik, tetapi apakah ini semacam kurangnya dukungan yang harus saya harapkan dari godaddy, haruskah saya menyesal tidak memilih dreamhosts saja?

Salam CJ

PS. Bukan jawaban, tetapi saran bahwa sekali git-accept bekerja pada godaddy (bukan?), Maka repositori dengan worktree terpisah adalah cara yang bagus untuk digunakan untuk web: http://toroid.org/ams/git- situs web howto


sumber
0

Cara termudah untuk melakukan ini adalah dengan menjalankan sesuatu seperti ini di server jauh Anda:

mkdir repo.git
cd repo.git
git init --bare 

Kemudian pada checkout devel Anda:

git push --all ssh://<username>@<your server>/~/path/to/repo/relative/to/homedir/repo.git

Tidak ada server atau apa pun yang diperlukan, dan Anda harus dapat mengambil / menarik dari mesin itu selama Anda memiliki akses ssh.

Jika Anda telah mengatur .ssh / config Anda, itu harus mengambil keuntungan dari itu dan menggunakan kunci pribadi apa pun yang mungkin telah Anda atur.

Jika Anda berencana untuk sering melakukan pembaruan, Anda dapat menambahkan repo jarak jauh ke checkout devel Anda:

git remote add godaddy ssh://<username>@<your server>/path/to/repo.git

Kemudian sejak saat itu Anda dapat:

git push godaddy

Untuk info lebih lanjut, lihat dokumen online digit push atau jalankan git push --helpuntuk meluncurkan halaman manual di lokal Anda.

acak
sumber
1
Ini lebih merupakan instalasi git pada server jarak jauh yang merepotkan. Jawaban Anda (sementara bermanfaat) hanya mencakup pembuatan repositori secara standar.
Tom Wright
1
Ahh, begitu. Saya tidak memikirkan itu. Anda mungkin dapat mengirim email dukungan hosting godaddy dan melihat apakah mereka dapat menginstal git untuk Anda, atau setidaknya deps minimum yang telanjang untuk Anda buat sendiri. Jika tidak, Anda mungkin dapat mengetahui arsitektur apa yang sedang berjalan dan mengkompilasi arsitektur Anda sendiri pada arsitektur yang serupa dan mengunggahnya.