Bir HostNine paylaşılan barındırma paketinde barındırdığı bir site ile aynı sorunla karşılaştım. Onlar da size ssh
erişim veriyorlar, ancak maalesef git
yüklememişler ve çalıştırmanıza bile izin vermiyorlar gcc
, böylece kullanıcı için git'i indirip yüklemeyi zorlaştırıyor.
Bu kısıtlamalar üzerinde düşünmek için tek yolu git ikili dosyaları onları olan başka bir bilgisayar üzerinden kopyalamak oldu. Belki de aynı çözüm sizin ve GoDaddy paylaşılan ana makineniz için işe yarar. İşte yaptım:
Önce sunucunuzun hangi mimariye sahip olduğunu bulun. Benim durumumda 32 bit (i386) idi. İşte bunu anlamanın birkaç yolu:
# 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
Daha sonra, aynı mimariye sahip ve üzerinde kurulu olan Linux çalıştıran başka bir bilgisayar bulmanız gerekiyor. Aynı mimari oldukları ve ihtiyacınız olan ikili dosyaları ve kütüphane dosyalarını bulabileceğiniz sürece, Linux'un aynı dağıtımını veya sürümünü çalıştırması bile gerekmez.
Ana git ikili dosyasının yerini bulmak için:
> which git
/usr/local/bin/git
Diğer bazı önemli ikili dosyalar (gibi git-receive-pack
) aynı dizinde bulunur, bu yüzden /usr/local/bin/git*
ihtiyacınız olan her şeyi aldığınızdan emin olmak için hepsini kopyalamanızı öneririm .
Diğer önemli dosyalar git'e bağımlıdır, kaynak sistemde bir yerde bir 'libexec' dizini altındadır. Bunları kopyalamazsanız git push
, yaptığım gibi, yapmaya çalıştığınızda şaşırtıcı bir hata mesajı alabilirsiniz :
git: 'index-pack' is not a git-command. See 'git --help'.
Target_host üzerindeki core git kitaplıklarını içeren dizini bulmak için şunları kullanabilirsiniz:
> git --exec-path
/usr/local/libexec/git-core
Önce bu dosyaları kopyalamayı ve sonra herhangi bir eksik paylaşılan kitaplıklardan şikayet edip etmediğini görmek için git çalıştırmayı denemenizi tavsiye ederim. Değilse, gitmek için (muhtemelen) iyidir. Varsa, okumaya devam edin. (Hedef ana bilgisayarda zaten varsa ve doğru sürümdeyse, paylaşılan kitaplıklar üzerinden kopyalamayı kullanamazsınız.)
Sen dosyaları kopyalayabilir scp
, rsync
, ftp
veya sen rahat ne olursa olsun. Kullandım scp
, böyle bir şey:
> 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
Sonra ssh to target_host. Aşağıdakilere bunlar gibi bazı satırlar eklemeniz gerekir ~/.bashrc
:
export PATH=$PATH:~/bin
export LD_LIBRARY_PATH=~/lib
export GIT_EXEC_PATH=~/libexec/git-core
Bu adımı unutursanız, aşağıdakileri yaptığınızda bu hatayı gördüğünüzde şaşırabilirsiniz git push
:
git-receive-pack: command not found
Bu, git.or.cz adresindeki Git SSS bölümünde belgelenmiştir:
Temelde sorun 'git-take-pack' uzak ucunda varsayılan $ PATH olmamasıdır.
...
- Doğru yolu ayarladığınızdan emin olun
.bashrc
(sadece değil .bash_profile
)
GIT_EXEC_PATH
belgelendiği yer 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.
Yeni kaynak ~/.bashrc
. Şimdi koşmayı deneyin git
.
Bana ilk defa verdi:
> git
git: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
Kaynak makinede çalıştırarak kopyalanacak paylaşılan kitaplıkların yerini anlayabildim:
> 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)
Benim durumumda ben sadece kopyalamak zorunda /lib/libcrypto.so.4
yanına ~/lib
on my target_host
ve her şey iyiydi.
Şimdi git
paylaşılan barındırma sunucunuz üzerinde bir çalışma olmalı ve onu itmek mümkün olmalıdır!
Şimdi sunucunuzda yeni bir git deposu ve çalışma ağacı oluşturmanız veya mevcut deponuzu / çalışma ağacınızı kopyalamanız gerekir.
Bu arada, gerçek içerik dosyalarını (yalnızca çıplak bir depoya dahil edilecek dosyaların aksine) dağıtmak istediğinizi söylediğiniz için, bu durumda sunucuda çıplak bir depo istediğinizi düşünmüyorum. config HEAD objects/ refs/
bir git push
.
toolmantim.com , normal bir git deposu ile çıplak bir havuz arasındaki farkı açıklar:
Varsayılan git deposu onu çalışma dizininiz olarak kullanacağınızı varsayar, bu yüzden git gerçek çıplak depo dosyalarını tüm proje dosyalarının yanında bir .git dizininde depolar. Uzak depolar, çalışan kopyalardan farklı olarak dosya sistemindeki dosyaların kopyalarına ihtiyaç duymaz, tek ihtiyaçları olan deponun kendisinin deltaları ve ikili olmayanlarıdır. “Çıplak” demek gitmektir. Sadece deponun kendisi.
target_host
Şimdilik, web sitenizi (veya dağıttığınız her şeyi) dağıtmak istediğiniz yerde bir dizin oluşturduğunuzu varsayacağım . Diyelim o dizini ~/www/my_site
. Hatta tüm dosyalarınızın üzerinde ftp'd yapmış olabilirsiniz ~/www/my_site already
. (Olup olmamanız önemli değildir.) Ayrıca, .git alt dizinini zaten kopyalamamış olduğunuzu da varsayacağım ~/www/my_site
(eğer varsa iyi çalışmalıdır).
Target_host üzerinde başlatılmış bir git deposu olmadığından, ilk adımınız bir tane oluşturmak olacaktır:
> cd ~/www/my_site
> git init
Sonra hangi ana bilgisayarda dağıtmak istediğiniz en son değişikliklerin bulunduğu depodan (geliştirme kutunuz, sanırım), dağıtmak için böyle bir şey yapmanız yeterlidir:
> git push --all ssh://username@target_host:port/~/www/my_site/.git
Üzerindeki deponuz target_host
zaten güncel değilse aşağıdaki gibi bir uyarı görebilirsiniz :
> 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'.
(Normal git
kullanımda bu mesajı asla görmezsiniz, bence, çünkü normalde çıplak depolara itiyorsunuz . Ancak bu durumda uzak depomuz hem bir çalışma ağacı hem de bir endeks ile normal bir repo git
olduğundan, anlaşılabilir bir şekilde bir şey karıştırmak.)
Yine de sunucunuzda 'yoksaymaya' ayarlamamız güvenli olduğunu düşünüyorum, çünkü doğrudan oradaki depoya herhangi bir taahhütte bulunmayacaksınız. (Tüm taahhütler muhtemelen geliştirme deponuzdan kaynaklanmalı ve daha sonra sunucuya aktarılmalıdır.)
Bu yüzden devam edin ve bunu her bastığınızda uyarıyı görmeyecek şekilde ayarlayın:
> ssh target_host 'cd ~/www/my_site/; git config receive.denyCurrentBranch ignore'
push
Kendisi sadece güncellemeler endeksi ise DEĞİL iş ağacın kendisinde dosyaları. Bu dosyaları güncellemek, yapmaya çalıştığımız şeylerin sadece bir kısmıdır, bu nedenle git
, dizinin içeriğini çalışma ağacının kendisine yazmayı söyleyene kadar işimiz yapılmaz :
> ssh target_host 'cd ~/www/my_site/; git reset --hard'
(Not: Sunucudaki çalışma ağacınızda yapmış olabileceğiniz değişikliklerin tümü depoda bulunanların üzerine yazılır.)
Ayrıca mattikus'un önerisini izledim ve sunucum için bir uzaktan kumanda oluşturdum:
> git remote add h9 ssh://username@target_host:port/~/www/my_site/.git
Şimdi dağıtmak için tek yapmam gereken:
> git push --all --force h9
> ssh remote_host 'cd ~/www/my_site/; git reset --hard'
Hatta bu komutları adlandırmak script/deploy
istediğim bir komut dosyasına atacak kadar ileri gittim .
Bu talimatlarda herhangi bir hata bulursanız veya daha iyi bir çözüm biliyorsanız lütfen bize bildirin.