AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 26836
In Process
Tom Wright
Tom Wright
Asked: 2009-06-17 12:18:28 +0800 CST2009-06-17 12:18:28 +0800 CST 2009-06-17 12:18:28 +0800 CST

在我的 GoDaddy 托管计划上设置 git 存储库

  • 772

我有一个使用 git 进行版本控制的项目。

我想要做的是在我的(启用 ssh 的)GoDaddy 共享主机包上设置一个 repo,以便我可以通过推送而不是在 FTP 中拖放来部署。

任何提示将不胜感激。最好是已经做过的人的帐户,但我个人在网上找不到任何帐户。

git godaddy
  • 3 3 个回答
  • 14434 Views

3 个回答

  • Voted
  1. Tyler Rick
    2009-07-03T17:39:29+08:002009-07-03T17:39:29+08:00

    我在 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
    

    接下来,您需要找到另一台运行 Linux 且具有相同架构并安装了 git 的计算机。它们甚至不必运行相同的 Linux 发行版或版本,只要它们具有相同的体系结构并且您可以找到所需的二进制文件和库文件。

    要查找主 git 二进制文件的位置:

    > which git
    /usr/local/bin/git
    

    其他一些重要的二进制文件(如git-receive-pack)也位于同一目录中,因此我建议您只复制所有文件/usr/local/bin/git*以确保获得所需的一切。


    其他重要的文件是 git 所依赖的文件位于源系统某处的“libexec”目录下。如果您不复制这些内容,当您尝试执行 a 时,您可能会收到一条令人惊讶的错误消息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这样每当我想部署时,我只需运行一个命令。

    如果您在这些说明中发现任何错误或您知道更好的解决方案,请告诉我。

    • 23
  2. user9822
    2009-06-18T05:00:28+08:002009-06-18T05:00:28+08:00

    我既是SF又是godaddy n00b,所以请多多包涵,但无论如何,我很高兴看到这里讨论这个问题。

    就我的 0.02 美元,我尝试在我的 linux 机器上构建 git(动态),将其存储到我的 godaddy 帐户,即使只是尝试推送到其他被动的 godaddy 机器,它也会由于缺少 openssl 而失败。也许如果我尝试使用 openssl 静态构建 git,但这感觉也是个坏主意。

    $ git remote add godaddy ssh://[email protected]//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 上工作(是吗?),那么带有分离工作树的存储库是部署 web 的好方法:http: //toroid.org/ams/git-网站指南

    • 2
  3. mattikus
    2009-06-17T14:20:23+08:002009-06-17T14:20:23+08:00

    最简单的方法是在远程服务器上运行类似的东西:

    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以在本地启动手册页。

    • 0

相关问题

  • 如何在 debian 上停止 git-daemon

  • Git 和 Mercurial

  • 如何修复 git 中第一次提交的元信息?

  • 如何编辑 git 的历史记录以更正不正确的电子邮件地址/名称 [关闭]

  • git如何控制访问权限

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve