我有一个使用 git 进行版本控制的项目。
我想要做的是在我的(启用 ssh 的)GoDaddy 共享托管包上设置一个存储库,以便我可以通过推送而不是在 FTP 中拖放进行部署。
任何提示将不胜感激。最好是已经做过的人的帐户,但我个人在网上找不到任何帐户。
Tyl*_*ick 23
我在 HostNine 共享托管包上托管的站点遇到了同样的问题。他们也给你ssh访问权限,但不幸的是,他们没有git安装,甚至没有给你访问 run 的权限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
Run Code Online (Sandbox Code Playgroud)
接下来,您需要找到另一台运行 Linux 且具有相同架构并安装了 git 的计算机。它们甚至不必运行相同的 Linux 发行版或版本,只要它们具有相同的体系结构并且您可以找到所需的二进制文件和库文件。
要查找主 git 二进制文件的位置:
> which git
/usr/local/bin/git
Run Code Online (Sandbox Code Playgroud)
其他一些重要的二进制文件(如git-receive-pack)也位于同一目录中,因此我建议您只复制所有文件/usr/local/bin/git*以确保获得所需的一切。
git 依赖的其他重要文件位于源系统上某处的“libexec”目录下。如果您不复制这些,当您尝试执行 a 时,您可能会收到令人惊讶的错误消息git push,就像我所做的那样:
git: 'index-pack' is not a git-command. See 'git --help'.
Run Code Online (Sandbox Code Playgroud)
要在 target_host 上查找包含核心 git 库的目录,您可以使用以下命令:
> git --exec-path
/usr/local/libexec/git-core
Run Code Online (Sandbox Code Playgroud)
我建议先复制这些文件,然后尝试运行 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
Run Code Online (Sandbox Code Playgroud)
然后 ssh 到 target_host。您需要在您的~/.bashrc:
export PATH=$PATH:~/bin
export LD_LIBRARY_PATH=~/lib
export GIT_EXEC_PATH=~/libexec/git-core
Run Code Online (Sandbox Code Playgroud)
如果您忘记了这一步,您在执行以下操作时可能会惊讶地看到此错误git push:
git-receive-pack: command not found
Run Code Online (Sandbox Code Playgroud)
这在 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.
Run Code Online (Sandbox Code Playgroud)
来源您的新~/.bashrc. 现在尝试运行git。
这是它第一次给我的:
> git
git: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
通过在源计算机上运行它,我能够找出要复制的共享库的位置:
> 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)
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我只需要复制/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
Run Code Online (Sandbox Code Playgroud)
然后,无论哪个主机拥有包含您要部署的最新更改的存储库(我猜是您的开发箱),您只需执行以下操作即可部署:
> git push --all ssh://username@target_host:port/~/www/my_site/.git
Run Code Online (Sandbox Code Playgroud)
如果您的存储库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'.
Run Code Online (Sandbox Code Playgroud)
(git我认为,在正常使用中,您永远不会看到该消息,因为您通常会推送到裸存储库。但由于我们的远程存储库在这种情况下是具有工作树和索引的普通存储库,git可以理解的是担心它可能把事情搞砸了。)
不过,我认为我们在您的服务器上将其设置为“忽略”是安全的,因为您不太可能直接向那里的存储库进行任何提交。(所有提交都应该来自您的开发存储库,然后被推送到服务器。)
所以继续设置这个,这样你就不会在每次按下时看到警告:
> ssh target_host 'cd ~/www/my_site/; git config receive.denyCurrentBranch ignore'
Run Code Online (Sandbox Code Playgroud)
在push本身只更新索引,不过,不是在工作树本身的文件。不过,更新这些文件只是我们尝试做的事情的全部内容,所以我们的工作直到我们告诉git将索引的内容写出到工作树本身才完成,如下所示:
> ssh target_host 'cd ~/www/my_site/; git reset --hard'
Run Code Online (Sandbox Code Playgroud)
(注意:您在服务器上的工作树中所做的任何更改都将被存储库中的内容覆盖。)
我也遵循了 mattikus 的建议并为我的服务器创建了一个遥控器:
> git remote add h9 ssh://username@target_host:port/~/www/my_site/.git
Run Code Online (Sandbox Code Playgroud)
所以现在我要做的就是部署:
> git push --all --force h9
> ssh remote_host 'cd ~/www/my_site/; git reset --hard'
Run Code Online (Sandbox Code Playgroud)
我什至将这些命令放入我命名的脚本中,script/deploy因此无论何时我想部署,我都只需要运行一个命令。
如果您发现这些说明中有任何错误,或者您知道更好的解决方案,请告诉我。
小智 0
最简单的方法是在远程服务器上运行如下命令:
mkdir repo.git
cd repo.git
git init --bare
Run Code Online (Sandbox Code Playgroud)
然后在你的开发结帐中:
git push --all ssh://<username>@<your server>/~/path/to/repo/relative/to/homedir/repo.git
Run Code Online (Sandbox Code Playgroud)
不需要服务器或其他任何东西,只要您有 ssh 访问权限,您就应该能够从该机器获取/拉取。
如果您也设置了 .ssh/config,它应该利用它并使用您可能设置的任何私钥。
如果您计划大量推出更新,您可以将远程存储库添加到您的开发结帐中:
git remote add godaddy ssh://<username>@<your server>/path/to/repo.git
Run Code Online (Sandbox Code Playgroud)
那么从那时起你就可以:
git push godaddy
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看在线文档git push或运行git push --help以在本地启动手册页。
| 归档时间: |
|
| 查看次数: |
14159 次 |
| 最近记录: |