我有一个使用git版本控制的项目。
我想要做的是在我的(启用ssh的)GoDaddy共享主机程序包上建立一个存储库,以便我可以通过推送进行部署,而无需拖放FTP。
任何提示将不胜感激。最好的办法是从已经做过的人那里获得一个帐户,但是我个人无法在网上找到任何帐户。
我有一个使用git版本控制的项目。
我想要做的是在我的(启用ssh的)GoDaddy共享主机程序包上建立一个存储库,以便我可以通过推送进行部署,而无需拖放FTP。
任何提示将不胜感激。最好的办法是从已经做过的人那里获得一个帐户,但是我个人无法在网上找到任何帐户。
Answers:
我在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'.
要在target_host上找到包含核心git库的目录,可以使用以下命令:
> 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.or.cz的Git常见问题解答中有记录:
基本上,问题是'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目录中。与工作副本不同,远程存储库不需要文件系统上文件的副本,它们所需要的只是存储库本身的增量和二进制内容。这就是“裸”对git的意义。只是存储库本身。
现在,我将假定您已经在target_host
要部署网站(或要部署的任何内容)的位置上创建了一个目录。我们将该目录称为~/www/my_site
。您甚至可以将所有文件ftp到~/www/my_site already
。(是否拥有并不重要。)我还暂时假设您尚未将.git子目录复制到~/www/my_site
(如果有,它应该可以正常工作)。
由于尚未在target_host上初始化git存储库,因此第一步是创建一个:
> 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
我认为,在正常使用情况下,您永远不会看到该消息,因为您通常会推送到裸存储库。但是由于在这种情况下,我们的远程存储库是既包含工作树又包含索引的常规存储库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
所以无论何时我想部署,我都只需运行一个命令。
如果您在这些说明中发现任何错误,或者您知道更好的解决方案,请告诉我。
我既是SF,又是Godaddy n00b,所以请多多包涵,但是无论如何,我很高兴看到此处对此进行讨论。
仅花费我的0.02美元,我尝试在Linux机器上(动态)构建git,将其转移到我的godaddy帐户,即使仅尝试推送到否则为被动的godaddy机器,由于缺少openssl,它也失败了。也许如果我尝试使用openssl静态构建git,但这也感觉不是一个好主意。
$ 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
离题,但这是我应该从教父那里得到的缺乏支持,我应该后悔没有选择梦想主持人吗?
最好的问候CJ
PS。不是答案,而是一个建议,一旦git-receive在godaddy上工作了(是吗?),那么具有分离的工作树的存储库是为Web部署的好方法:http ://toroid.org/ams/git- 网站方法
最简单的方法是在远程服务器上运行如下代码:
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,则应该利用它并使用您可能已设置的任何私钥。
如果您打算大量发布更新,则可以将远程仓库添加到开发结帐中:
git remote add godaddy ssh://<username>@<your server>/path/to/repo.git
然后,您可以:
git push godaddy
有关更多信息,请查看在线文档git push
或运行git push --help
以在本地启动手册页。