การตั้งค่า repo คอมไพล์ในแผนการโฮสต์ของ GoDaddy ของฉัน


14

ฉันมีโครงการที่ควบคุมเวอร์ชันโดยใช้ git

สิ่งที่ฉันต้องการจะทำคือตั้งค่า repo บนแพ็คเกจโฮสติ้งที่ใช้ร่วมกัน (เปิดใช้งาน ssh) GoDaddy ของฉันเพื่อให้ฉันสามารถปรับใช้ด้วยการกดแทนที่จะลากและวางใน FTP

เคล็ดลับใด ๆ ที่จะได้รับการชื่นชม ดีที่สุดจะเป็นบัญชีจากคนที่ทำไปแล้ว แต่ฉันไม่สามารถหาออนไลน์ได้เป็นการส่วนตัว


คุณอาจจะได้คำตอบที่ดีกว่านี้จาก StackOverflow
mrTomahawk

ใช่มันเป็นการโยนขึ้นระหว่างคนทั้งสอง อาจลองโพสต์ข้าม ขอบคุณ
Tom Wright

ไม่ว่าฉันจะตั้งค่า repit git แต่วิธีการตั้งค่าการเขียนโปรแกรมเซิร์ฟเวอร์รหัสที่เกี่ยวข้อง? - การลงคะแนนของฉันสำหรับความ
ผิดพลาดของเซิร์ฟเวอร์

1
อาจไม่ใช่ แต่นักพัฒนาจะรู้เกี่ยวกับมันเพราะพวกเขาไม่น่าไว้ใจให้เราตั้งค่า
tomjedrz

1
สิ่งที่แน่ใจ tomjedrz และเพื่อเห็นแก่ความครบถ้วนสมบูรณ์ของ: stackoverflow.com/questions/1003885/...
ทอมไรท์

คำตอบ:


23

ฉันพบปัญหาเดียวกันกับเว็บไซต์ที่ฉันโฮสต์บนแพ็คเกจโฮสต์โฮสติ้งที่ใช้ร่วมกันของ HostNine พวกเขาให้sshสิทธิ์การเข้าถึงแก่คุณเช่นกัน แต่น่าเสียดายที่พวกเขาไม่ได้gitติดตั้งและไม่อนุญาตให้คุณเรียกใช้gccซึ่งทำให้ค่อนข้างยากในการดาวน์โหลดและติดตั้ง git สำหรับผู้ใช้ของคุณ

วิธีเดียวที่ฉันสามารถนึกถึงข้อ จำกัด เหล่านี้คือการคัดลอกไบนารี git จากคอมพิวเตอร์เครื่องอื่นที่มีพวกเขา บางทีโซลูชันเดียวกันอาจใช้ได้ผลสำหรับคุณและ GoDaddy ที่ใช้ร่วมกันกับโฮสต์ นี่คือสิ่งที่ฉันทำ:


ก่อนอื่นให้พิจารณาว่าสถาปัตยกรรมเซิร์ฟเวอร์ของคุณมีอะไรบ้าง ในกรณีของฉันมันคือ 32- บิต (i386) ต่อไปนี้เป็นวิธีการคิดออก:

# 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

ต่อไปคุณจะต้องหาคอมพิวเตอร์เครื่องอื่นที่ใช้ Linux ที่มีสถาปัตยกรรมเดียวกันและติดตั้ง git ไว้ พวกเขาไม่จำเป็นต้องเรียกใช้ Linux หรือเวอร์ชั่นเดียวกันตราบใดที่มันเป็นสถาปัตยกรรมเดียวกันและคุณสามารถค้นหาไบนารีและไฟล์ไลบรารีที่คุณต้องการ

หากต้องการค้นหาตำแหน่งของไบนารี git หลัก:

> which git
/usr/local/bin/git

ไบนารีที่สำคัญอื่น ๆ (เช่นgit-receive-pack) ยังอยู่ในไดเรกทอรีเดียวกันดังนั้นฉันขอแนะนำให้เพียงคัดลอกไฟล์ทั้งหมด/usr/local/bin/git*เพื่อให้แน่ใจว่าคุณได้รับทุกสิ่งที่คุณต้องการ


ไฟล์สำคัญอื่น ๆ ที่ git นั้นอาศัยนั้นอยู่ภายใต้ไดเรกทอรี 'libexec' บางแห่งในระบบต้นทาง หากคุณไม่คัดลอกสิ่งเหล่านี้คุณอาจได้รับข้อความแสดงข้อผิดพลาดที่น่าประหลาดใจเมื่อคุณพยายามทำgit pushเช่นเดียวกับที่ฉันทำ:

git: 'index-pack' is not a git-command. See 'git --help'.

ในการค้นหาไดเรกทอรีที่มีไลบรารี core git บน target_host คุณสามารถใช้สิ่งนี้:

> git --exec-path
/usr/local/libexec/git-core

ฉันจะแนะนำให้คัดลอกไฟล์เหล่านั้นไปก่อนแล้วลองใช้ git เพื่อดูว่ามันบ่นเกี่ยวกับห้องสมุดสาธารณะที่ขาดหายไปหรือไม่ ถ้าไม่เช่นนั้นคุณก็คงจะดี ถ้าเป็นเช่นนั้นอ่านต่อไป (ไม่ใช้การคัดลอกไปยังไลบรารีที่ใช้ร่วมกันหากมีอยู่แล้วบนโฮสต์เป้าหมายและเป็นเวอร์ชันที่ถูกต้อง)

คุณสามารถคัดลอกไฟล์กับscp, rsync, ftpหรือสิ่งที่คุณมีความสะดวกสบายด้วย ฉันใช้scpสิ่งนี้:

> 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

จากนั้น ssh ไปยัง target_host คุณจะต้องเพิ่มบรรทัดเช่นนี้ใน~/.bashrc:

export PATH=$PATH:~/bin
export LD_LIBRARY_PATH=~/lib
export GIT_EXEC_PATH=~/libexec/git-core

หากคุณลืมขั้นตอนนี้คุณอาจประหลาดใจเมื่อเห็นข้อผิดพลาดนี้เมื่อคุณทำgit push:

git-receive-pack: command not found

นี่เป็นเอกสารเกี่ยวกับคำถามที่พบบ่อย Git ใน git.or.cz:

โดยทั่วไปปัญหาคือ 'git-receive-pack' ไม่ได้อยู่ในค่าเริ่มต้น $ PATH ที่ปลายด้านไกล

...

  • ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าเส้นทางที่ถูกต้องไว้.bashrc(ไม่เพียง แต่.bash_profile)

GIT_EXEC_PATHมีการบันทึกไว้ใน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.

~/.bashrcแหล่งใหม่ของคุณ gitตอนนี้พยายามทำงาน


นี่คือสิ่งที่ให้ฉันครั้งแรก:

> git
git: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory

ฉันสามารถหาที่ตั้งของไลบรารีที่ใช้ร่วมกันเพื่อคัดลอกโดยเรียกใช้บนเครื่องต้นทาง:

> 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)

ในกรณีของฉันฉันต้องคัดลอก/lib/libcrypto.so.4ไปที่~/libบนของฉันtarget_hostและทุกอย่างดี


ตอนนี้คุณควรมีgitเซิร์ฟเวอร์โฮสติ้งที่ใช้ร่วมกันและคุณควรจะสามารถผลักดันมันได้!

ตอนนี้คุณต้องสร้างที่เก็บ git ใหม่และแผนผังต้นไม้บนเซิร์ฟเวอร์ของคุณหรือคัดลอกพื้นที่เก็บข้อมูล / ต้นไม้ทำงานที่มีอยู่ของคุณ


อย่างไรก็ตามฉันไม่คิดว่าที่เก็บเปลือยเป็นสิ่งที่คุณต้องการบนเซิร์ฟเวอร์ในกรณีนี้เนื่องจากคุณบอกว่าคุณต้องการปรับใช้ไฟล์เนื้อหาจริง (ตรงข้ามกับ config HEAD objects/ refs/ไฟล์ที่จะรวมอยู่ในที่เก็บเปลือย) ทุกครั้ง git pushคุณทำ

toolmantim.comอธิบายความแตกต่างระหว่างที่เก็บ git ปกติกับที่เก็บเปลือย:

ที่เก็บข้อมูล git เริ่มต้นจะถือว่าคุณใช้เป็นไดเรกทอรีทำงานดังนั้น git จะเก็บไฟล์ที่เก็บเปล่าจริงในไดเรกทอรี. git พร้อมกับไฟล์โครงการทั้งหมด ที่เก็บข้อมูลระยะไกลไม่ต้องการสำเนาของไฟล์ในระบบไฟล์ซึ่งแตกต่างจากสำเนาที่ใช้งานได้สิ่งที่พวกเขาต้องการคือเดลตาและไบนารีอะไรที่ไม่ได้เป็นที่เก็บของตัวมันเอง นี่คือสิ่งที่ "เปลือย" หมายถึงการคอมไพล์ เพียงแค่พื้นที่เก็บข้อมูลของตัวเอง


ฉันจะสมมติว่าคุณได้สร้างไดเรกทอรีในtarget_hostตำแหน่งที่คุณต้องการปรับใช้เว็บไซต์ของคุณแล้ว (หรือสิ่งที่คุณกำลังปรับใช้) เรียกไดเรกทอรี~/www/my_siteนั้น คุณอาจได้ ftp'd ~/www/my_site alreadyแม้ไฟล์ทั้งหมดของคุณจะ (ไม่ว่าคุณจะมีความสำคัญหรือไม่ก็ตาม) ฉันจะสมมติด้วยเช่นกันว่าคุณไม่ได้คัดลอกไดเรกทอรีย่อย. git ไปยัง~/www/my_site(ควรทำงานได้ดีถ้าคุณมี)

เนื่องจากยังไม่มีที่เก็บ git ที่เริ่มต้นบน target_host ขั้นตอนแรกของคุณคือการสร้าง:

> cd ~/www/my_site
> git init

จากที่ใดที่โฮสต์มีที่เก็บพร้อมกับการเปลี่ยนแปลงล่าสุดที่คุณต้องการปรับใช้ (กล่องพัฒนาของคุณฉันจะเดา) คุณต้องทำสิ่งนี้เพื่อปรับใช้:

> git push --all ssh://username@target_host:port/~/www/my_site/.git

คุณอาจเห็นคำเตือนเช่นนี้หากที่เก็บของคุณtarget_hostยังไม่เป็นปัจจุบัน:

> 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'.

(ในgitการใช้งานปกติคุณไม่เคยเห็นข้อความนั้นฉันคิดว่าเพราะคุณมักจะผลักดันไปยังที่เก็บเปลือยแต่เนื่องจากพื้นที่เก็บข้อมูลระยะไกลของเราในกรณีนี้เป็น repo ปกติที่มีทั้งแผนผังการทำงานและดัชนีgitมีความกังวลว่าอาจ เลอะสิ่ง)

ฉันคิดว่ามันปลอดภัยสำหรับเราที่จะตั้งค่าเป็น 'เพิกเฉย' บนเซิร์ฟเวอร์ของคุณเนื่องจากคุณไม่น่าจะทำคอมมิทใด ๆ กับที่เก็บตรงนั้น (ความมุ่งมั่นทั้งหมดน่าจะมาจากแหล่งเก็บข้อมูลการพัฒนาของคุณแล้วส่งไปยังเซิร์ฟเวอร์)

ดังนั้นไปข้างหน้าและตั้งค่านี้เพื่อที่คุณจะไม่เห็นคำเตือนทุกครั้งที่คุณกด:

> ssh target_host 'cd ~/www/my_site/; git config receive.denyCurrentBranch ignore'

pushตัวเองเพียงการปรับปรุงดัชนี แต่ไม่ไฟล์ในต้นไม้การทำงานของตัวเอง การอัปเดตไฟล์เหล่านี้เป็นเพียงจุดทั้งหมดของสิ่งที่เราพยายามทำดังนั้นงานของเราจึงไม่เสร็จจนกว่าเราจะบอกgitให้เขียนเนื้อหาของดัชนีไปยังแผนผังต้นไม้เองเช่น:

> ssh target_host 'cd ~/www/my_site/; git reset --hard'

(หมายเหตุ: การเปลี่ยนแปลงใด ๆ ที่คุณอาจมีในแผนผังการทำงานของคุณบนเซิร์ฟเวอร์จะถูกเขียนทับโดยสิ่งที่อยู่ในที่เก็บ)

ฉันทำตามคำแนะนำของ mattikus และสร้างรีโมตสำหรับเซิร์ฟเวอร์ของฉัน:

> git remote add h9 ssh://username@target_host:port/~/www/my_site/.git

ดังนั้นตอนนี้สิ่งที่ฉันต้องทำเพื่อปรับใช้คือ:

> git push --all --force h9
> ssh remote_host 'cd ~/www/my_site/; git reset --hard'

ฉันยังใช้คำสั่งเหล่านี้ในสคริปต์ที่ฉันตั้งชื่อscript/deployดังนั้นเมื่อใดก็ตามที่ฉันต้องการปรับใช้ฉันมีเพียงคำสั่งเดียวที่จะเรียกใช้

โปรดแจ้งให้เราทราบหากคุณพบข้อผิดพลาดใด ๆ ในคำแนะนำเหล่านี้หรือหากคุณรู้วิธีแก้ปัญหาที่ดีกว่า


! ที่น่าตื่นตาตื่นใจ ฉันจะพยายาม 10 เท่าถ้าเป็นไปได้
icc97

2

ฉันเป็นทั้ง SF และ godaddy n00b ดังนั้นโปรดอดทนกับฉัน แต่อย่างไรก็ตามฉันมีความสุขมากที่เห็นสิ่งนี้กล่าวถึงที่นี่

แค่ $ 0.02 ของฉันฉันพยายามสร้าง git (แบบไดนามิก) ในกล่อง linux ของฉันซ่อนมันไว้ที่บัญชี godaddy ของฉันและแม้ว่าจะพยายามเพียงแค่ผลักดันไปยังเครื่อง godaddy ที่ไม่โต้ตอบก็ตามมันล้มเหลวเนื่องจาก openssl หายไป บางทีถ้าฉันพยายามสร้าง git แบบสแตติกด้วย openssl แต่มันก็ให้ความรู้สึกที่ไม่ดีเช่นกัน

$ git remote add godaddy ssh://unclecj@sveningsson.info//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

ปิดหัวข้อ แต่นี่คือการขาดการสนับสนุนที่ฉันคาดหวังจาก godaddy ฉันควรเสียใจที่ไม่เลือก Dreamhosts แทนหรือไม่

ขอแสดงความนับถือ CJ

PS ไม่ใช่คำตอบ แต่ข้อเสนอแนะที่เมื่อ git-receive ทำงานบน godaddy (มันคืออะไร) จากนั้นที่เก็บที่มี worktree เดี่ยวเป็นวิธีที่ดีในการปรับใช้เว็บ: http://toroid.org/ams/git- เว็บไซต์ HOWTO


0

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้สิ่งนี้บนเซิร์ฟเวอร์ระยะไกลของคุณ:

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

จากนั้นในการชำระเงินที่พัฒนาของคุณ:

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

ไม่จำเป็นต้องใช้เซิร์ฟเวอร์หรือสิ่งอื่นใดและคุณควรสามารถดึง / ดึงจากเครื่องนั้นได้ตราบใดที่คุณมีการเข้าถึง ssh

หากคุณมีการตั้งค่า. ssh / config ของคุณเช่นกันควรใช้ประโยชน์จากสิ่งนั้นและใช้คีย์ส่วนตัวใด ๆ ที่คุณอาจตั้งค่าไว้

หากคุณวางแผนที่จะผลักดันการอัปเดตเป็นจำนวนมากคุณสามารถเพิ่ม repo ระยะไกลลงในการชำระเงินของผู้พัฒนา:

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

จากนั้นคุณสามารถ:

git push godaddy

สำหรับข้อมูลเพิ่มเติมให้ตรวจสอบเอกสารออนไลน์git pushgit push --helpที่เปิดใช้งานหรือเรียกใช้เพื่อเปิดหน้า man ในท้องถิ่นของคุณ


1
มันเป็นมากกว่าการติดตั้งคอมไพล์บนเซิร์ฟเวอร์ระยะไกลที่ลำบาก คำตอบของคุณ (ในขณะที่มีประโยชน์) เพียงครอบคลุมการสร้างพื้นที่เก็บข้อมูลในแบบมาตรฐาน
Tom Wright

1
อ่าฉันเข้าใจแล้ว ฉันไม่ได้คิดอย่างนั้น คุณอาจจะสามารถส่งอีเมลการสนับสนุนโฮสติ้งของ godaddy และดูว่าพวกเขาสามารถติดตั้งคอมไพล์ให้คุณหรืออย่างน้อยที่สุดคุณก็สามารถสร้างมันเองได้ หากไม่มีคุณอาจสามารถรู้ได้ว่าสถาปัตยกรรมใดที่ใช้งานอยู่และคอมไพล์ของคุณเองในสิ่งที่คล้ายกันและทำการอัปโหลด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.