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 ssh
quyền truy cập, nhưng rất tiếc họ không git
cà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.4
qua ~/lib
trên của tôi target_host
và tất cả mọi thứ vẫn ổn.
Bây giờ bạn nên làm việc git
trê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_host
nơ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_host
chư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 git
sử 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 push
thâ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 git
cầ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.