Thiết lập repo git trên gói lưu trữ GoDaddy của tôi


14

Tôi có một dự án được kiểm soát phiên bản bằng git.

Những gì tôi muốn có thể làm là thiết lập một repo trên gói lưu trữ chia sẻ GoDaddy (hỗ trợ ssh) của tôi để tôi có thể triển khai bằng một cú đẩy thay vì kéo và thả trong FTP.

Bất kỳ lời khuyên sẽ được đánh giá cao. Tốt nhất sẽ là một tài khoản từ một người đã thực hiện nó, nhưng cá nhân tôi không thể tìm thấy bất kỳ trực tuyến nào.


bạn có thể sẽ nhận được câu trả lời tốt hơn về điều này từ StackOverflow
mrTomahawk

Vâng, đó là một sự thay đổi giữa hai người. Có thể thử đăng chéo nó. Cảm ơn.
Tom Wright

Không phải là tôi đã thiết lập một repo git nhưng làm thế nào là thiết lập một chương trình máy chủ mã nguồn liên quan? - Phiếu bầu của tôi là dành cho serverfault, rõ ràng
dị

1
Có lẽ là không, nhưng các nhà phát triển sẽ biết về nó, bởi vì họ không thể tin tưởng chúng tôi để thiết lập nó.
tomjedrz

1
Chắc chắn điều đó tomjedrz, và vì sự hoàn chỉnh của nó: stackoverflow.com/questions/1003885/ mẹo
Tom Wright

Câu trả lời:


23

Tôi gặp vấn đề tương tự với một trang web mà tôi đã lưu trữ trên gói lưu trữ chia sẻ HostNine. Họ cũng cung cấp cho bạn sshquyền truy cập, nhưng rất tiếc họ không gitcài đặt và thậm chí không cung cấp cho bạn quyền truy cập để chạy gcc, khiến việc tải xuống và cài đặt git cho người dùng của bạn khá khó khăn.

Cách duy nhất tôi có thể nghĩ ra để khắc phục những hạn chế này là sao chép các tệp nhị phân git từ một máy tính khác có chúng. Có lẽ giải pháp tương tự sẽ có hiệu quả với bạn và máy chủ chia sẻ GoDaddy của bạn. Đây là những gì tôi đã làm:


Đầu tiên hãy tìm hiểu kiến ​​trúc máy chủ của bạn có gì. Trong trường hợp của tôi, nó là 32 bit (i386). Dưới đây là một số cách để tìm ra điều đó:

# 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

Tiếp theo, bạn cần tìm một máy tính khác chạy Linux có cùng kiến ​​trúc và với git được cài đặt trên nó. Họ thậm chí không phải chạy cùng một bản phân phối hoặc phiên bản Linux, miễn là chúng có cùng kiến ​​trúc và bạn có thể tìm thấy các tệp nhị phân và tệp thư viện bạn cần.

Để tìm vị trí của nhị phân git chính:

> which git
/usr/local/bin/git

Một số nhị phân quan trọng khác (như git-receive-pack) cũng nằm trong cùng thư mục, vì vậy tôi khuyên bạn chỉ nên sao chép trên tất cả /usr/local/bin/git*để đảm bảo bạn có được mọi thứ bạn cần.


Các tệp quan trọng khác là git phụ thuộc vào thư mục 'libexec' ở đâu đó trên hệ thống nguồn. Nếu bạn không sao chép chúng, bạn có thể nhận được thông báo lỗi đáng ngạc nhiên khi bạn cố gắng thực hiện git push, như tôi đã làm:

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

Để tìm thư mục chứa các thư viện git lõi trên target_host, bạn có thể sử dụng:

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

Tôi sẽ khuyên bạn nên sao chép các tệp đó trước và sau đó thử chạy git để xem liệu nó có phàn nàn về bất kỳ thư viện chia sẻ bị thiếu nào không. Nếu nó không, thì bạn (có lẽ) tốt để đi. Nếu có, sau đó tiếp tục đọc. (Không sử dụng sao chép trên các thư viện dùng chung nếu chúng đã tồn tại trên máy chủ đích và là phiên bản chính xác.)

Bạn có thể sao chép các tập tin với scp, rsync, ftp, hoặc bất cứ điều gì bạn cảm thấy thoải mái với. Tôi đã sử dụng scp, một cái gì đó như thế này:

> 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

Sau đó ssh đến target_host. Bạn sẽ cần thêm một số dòng như thế này vào ~/.bashrc:

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

Nếu bạn quên bước này, bạn có thể ngạc nhiên khi thấy lỗi này khi bạn thực hiện git push:

git-receive-pack: command not found

Điều này được ghi lại trên Câu hỏi thường gặp về Git trên git.or.cz:

Về cơ bản, vấn đề là 'git-receive-pack' không có trong $ PATH mặc định ở đầu xa.

...

  • Đảm bảo rằng bạn có đường dẫn chính xác được thiết lập .bashrc(không chỉ .bash_profile)

GIT_EXEC_PATHđược ghi lại trên 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.

Nguồn mới của bạn ~/.bashrc. Bây giờ hãy thử chạy git.


Đây là những gì nó đã cho tôi lần đầu tiên:

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

Tôi đã có thể tìm ra vị trí của các thư viện được chia sẻ để sao chép bằng cách chạy này trên máy nguồn:

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

Trong trường hợp của tôi, tôi chỉ phải copy /lib/libcrypto.so.4qua ~/libtrên của tôi target_hostvà tất cả mọi thứ vẫn ổn.


Bây giờ bạn nên làm việc gittrên máy chủ lưu trữ được chia sẻ của mình và bạn sẽ có thể đẩy mạnh vào nó!

Bây giờ bạn cần tạo một kho git mới và cây làm việc trên máy chủ của bạn hoặc sao chép kho lưu trữ / cây công việc hiện có của bạn.


Nhân tiện, tôi không nghĩ rằng một kho lưu trữ trần là những gì bạn muốn trên máy chủ trong trường hợp này vì bạn nói rằng bạn muốn triển khai các tệp nội dung thực tế (trái ngược với các config HEAD objects/ refs/tệp sẽ được bao gồm trong một kho lưu trữ trần) bất cứ khi nào bạn làm a git push.

toolmantim.com giải thích sự khác biệt giữa kho lưu trữ git thông thường và kho lưu trữ trần:

Kho lưu trữ git mặc định giả định rằng bạn sẽ sử dụng nó làm thư mục làm việc của mình, vì vậy git lưu trữ các tệp kho lưu trữ thực tế trong một thư mục .git cùng với tất cả các tệp dự án. Các kho lưu trữ từ xa không cần các bản sao của các tệp trên hệ thống tệp không giống như các bản sao đang hoạt động, tất cả những gì chúng cần là các bản deltas và nhị phân của chính kho lưu trữ. Đây là những gì mà trần trần có nghĩa là git. Chỉ là kho lưu trữ chính nó.


Tôi sẽ giả định rằng hiện tại bạn đã tạo một thư mục trên target_hostnơi bạn muốn triển khai trang web của mình (hoặc bất cứ điều gì bạn đang triển khai). Hãy gọi thư mục đó ~/www/my_site. Bạn thậm chí có thể đã vượt qua tất cả các tệp của mình ~/www/my_site already. (Cho dù bạn có hay không không quan trọng.) Tôi cũng sẽ cho rằng hiện tại bạn chưa sao chép thư mục con .git sang ~/www/my_site(nó sẽ hoạt động tốt nếu bạn có).

Vì chưa có kho lưu trữ git được khởi tạo trên target_host, bước đầu tiên của bạn sẽ là tạo một kho:

> cd ~/www/my_site
> git init

Sau đó, từ bất kỳ máy chủ nào có kho lưu trữ với những thay đổi mới nhất bạn muốn triển khai (hộp phát triển của bạn, tôi đoán vậy), bạn chỉ cần làm một cái gì đó như thế này để triển khai:

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

Bạn có thể thấy một cảnh báo như thế này nếu kho lưu trữ của bạn target_hostchưa được cập nhật:

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

(Trong bình thường gitsử dụng bạn không bao giờ thấy thông báo đó, tôi nghĩ rằng, bởi vì bạn đang bình thường đẩy để trần kho. Nhưng kể từ kho lưu trữ từ xa của chúng tôi trong trường hợp này là một repo bình thường với cả một cây làm việc và một chỉ số, gitđược hiểu lo ngại rằng nó có thể làm hỏng cái gì đó

Tuy nhiên, tôi nghĩ rằng chúng tôi an toàn khi đặt nó thành 'bỏ qua' trên máy chủ của bạn, bởi vì bạn không có khả năng thực hiện bất kỳ cam kết nào trực tiếp với kho lưu trữ ở đó. (Tất cả các cam kết có thể bắt nguồn từ kho lưu trữ phát triển của bạn và sau đó được đẩy lên máy chủ.)

Vì vậy, hãy tiếp tục và thiết lập điều này để bạn sẽ không thấy cảnh báo mỗi khi bạn đẩy:

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

Bản pushthân nó chỉ cập nhật chỉ mục, tuy nhiên, KHÔNG phải các tệp trong cây công việc. Tuy nhiên, việc cập nhật các tệp đó chỉ là một phần của toàn bộ những gì chúng tôi đang cố gắng thực hiện, vì vậy công việc của chúng tôi không được thực hiện cho đến khi chúng tôi yêu gitcầu viết ra nội dung của chỉ mục cho chính cây công việc, như vậy:

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

(Lưu ý: Mọi thay đổi bạn có thể có trong cây công việc của mình trên máy chủ sẽ bị ghi đè bởi những gì trong kho lưu trữ.)

Tôi cũng đã làm theo đề xuất của mattikus và tạo một điều khiển từ xa cho máy chủ của mình:

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

Vì vậy, bây giờ tất cả những gì tôi phải làm để triển khai là:

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

Tôi thậm chí đã đi xa đến mức ném các lệnh này vào một tập lệnh mà tôi đặt tên script/deployđể bất cứ khi nào tôi muốn triển khai tôi chỉ có một lệnh duy nhất để chạy.

Xin vui lòng cho tôi biết nếu bạn tìm thấy bất kỳ sai lầm trong các hướng dẫn này hoặc nếu bạn biết về một giải pháp tốt hơn.


Kinh ngạc! Tôi sẽ +10 cho nỗ lực nếu có thể.
icc97

2

Tôi là cả SF và godaddy n00b, vì vậy hãy đồng ý với tôi, nhưng dù sao, tôi rất vui khi thấy điều này được thảo luận ở đây.

Chỉ 0,02 đô la của tôi, tôi đã cố gắng xây dựng git (động) trên hộp linux của mình, chuyển nó sang tài khoản godaddy của tôi và ngay cả khi chỉ cố gắng đẩy vào máy Godaddy thụ động khác, nó vẫn thất bại do thiếu opensl. Có lẽ nếu tôi cố gắng xây dựng git tĩnh với openssl, nhưng nó cũng cảm thấy như một ý tưởng tồi.

$ 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

Không có chủ đề, nhưng đây có phải là sự thiếu hỗ trợ mà tôi nên mong đợi từ godaddy, tôi có nên hối hận vì đã không chọn dreamhosts không?

Trân trọng

Tái bút Không phải là một câu trả lời, nhưng một gợi ý rằng một khi git-receive đang hoạt động trên godaddy (phải không?), Thì một kho lưu trữ với một worktree tách rời là một cách tuyệt vời để triển khai cho web: http://toroid.org/ams/git- trang web-làm thế nào


0

Cách dễ nhất để làm điều này là chạy một cái gì đó như thế này trên máy chủ từ xa của bạn:

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

Sau đó, trên thanh toán phát triển của bạn:

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

Không có máy chủ hoặc bất cứ thứ gì khác được yêu cầu và bạn sẽ có thể tìm nạp / kéo từ máy đó cũng như miễn là bạn có quyền truy cập ssh.

Nếu bạn cũng đã thiết lập .ssh / config, bạn nên tận dụng điều đó và sử dụng bất kỳ khóa riêng nào bạn có thể đã thiết lập.

Nếu bạn có kế hoạch đẩy ra các bản cập nhật rất nhiều, bạn có thể thêm một repo từ xa vào thanh toán phát triển của mình:

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

Sau đó, từ đó bạn có thể:

git push godaddy

Để biết thêm thông tin, hãy xem các tài liệu trực tuyến trêngit push hoặc chạy git push --helpđể khởi chạy trang man trên địa phương của bạn.


1
Mặc dù vậy, cài đặt git trên máy chủ từ xa thật rắc rối. Câu trả lời của bạn (trong khi hữu ích) chỉ bao gồm việc tạo kho lưu trữ theo cách chuẩn.
Tom Wright

1
À, tôi hiểu rồi. Tôi đã không nghĩ về điều đó. Bạn có thể gửi email cho bộ phận hỗ trợ lưu trữ của godaddy và xem liệu họ có thể cài đặt git cho bạn hay ít nhất là các bản tối thiểu để bạn tự xây dựng nó. Nếu không, bạn có thể tìm ra kiến ​​trúc nào nó đang chạy và biên dịch kiến ​​trúc của riêng bạn trên một cái tương tự và tải nó lên.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.