【问题标题】:Git remote as localGit远程作为本地
【发布时间】:2013-04-15 15:37:24
【问题描述】:

我的虚拟主机在他们基于 Linux(我相信是 Debian)的虚拟主机服务器上安装了 Git 作为“客户端”,而不是作为“服务器”。

有没有办法通过我的 Windows 7 台式计算机使用 GitGUI 连接到我的 Web 主机的 Git 安装?

【问题讨论】:

    标签: git git-gui


    【解决方案1】:

    “客户端”和“服务器”Git 安装之间几乎没有区别:Git 只提供了一个能够自行为 Git 存储库提供服务的程序 — git-daemon。由于它不提供身份验证,它通常只安装在为可公开访问的存储库提供服务的机器上(使用免费的只读git:// 协议)。

    对 Git 存储库的所有“常规”写访问都介导由其他软件 - 通常是 HTTP[S] 服务器(用于http:// 协议)或SSH 服务器(用于ssh:// 协议)。该软件执行必要的身份验证和授权,然后调用低级 Git 程序进行客户端/服务器数据交换。

    因此,您应该首先决定如何访问您的存储库。

    在您的情况下,我会选择 SSH:由于您的 Web 主机(据说)是一个基于 Linux 的 VPS,它很可能已经启动并运行了 SSH 服务器,并且您应该为此获得一个帐户(如果没有,有时间再问)。

    故事的其余部分解释here(带有漂亮的图片)。对您来说唯一的区别是,由于您不会使用 github,因此您必须手动将您的公共 SSH 密钥传输到您的 VPS 主机。

    更多关于在服务器上托管 Git 的信息,通常是 is available in The Bookthis 是关于 Git 中改进的 HTTP[S] 支持的后期附录)。

    更新在 Git 中使用 SSH。

    事实上,托管通过 SSH 访问的 Git 存储库可能既简单又复杂,具体取决于您的设置 — 简单的解决方案或具有虚拟化 Git 用户和访问权限管理等的高端服务器。

    使用 SSH,Git 以这种方式工作:

    1. 客户端与运行在托管目标 Git 存储库的机器上的 SSH 服务器进程执行 SSH 连接。通常这是使用所谓的 pubkey 身份验证来完成的。
    2. 连接建立后,客户端告诉对方生成一个特殊的 Git 进程,然后与本地 Git 进程通信,SSH 执行它们的交换——经过身份验证和加密。

    为了让我们更进一步,还有两个必须掌握的技巧:

    • 虽然 SSH 支持多种“服务”(例如,SFTP — 一种安全版本的 FTP,并制作普通 TCP 隧道),但它最常见的用例是远程启动进程,在最常见的情况下它是shell(这就是为什么它毕竟被命名为 SSH - 一个安全的 SHell)。

      当这样一个远程进程启动时,它会使用登录用户的凭据。因此,当 登录到 SSH 服务器时——“手动”或 Git 为你完成此操作——在远程服务器上启动一个 shell,它使用 remote 您作为身份验证的用户。

    • 在尝试访问远程存储库之前,Git 客户端会解析该存储库的 URL。血淋淋的细节在git-fetch manual 中,但简单的事情是这样的 URL

      ssh://user@server/path/to/the/repo.git
      

      分解为协议部分,用户,服务器和存储库的路径,即

      /path/to/the/repo.git
      

      此存储库路径是服务器上的物理路径。所以是的,就是这么简单:你不必调整某种配置文件来告诉 Git 存储库在哪里,相反,你只需在你的 URL 中指定它。

      存储库路径处理的一个更高级的转折是可以使用特殊的快捷方式来引用远程用户的主目录。这是使用路径完成的,例如

      /~/devel/repo.git
      

      这使得 Git 在远程用户的主目录下查找名为“devel”的目录,然后在其中查找“repo.git”目录。如果您不想留出一个特殊的目录来保存 Git 存储库,这种方法很有用。这种方法也非常适合单人项目。

      在典型的基于 Linux 的操作系统上,用户的主目录位于 /home 层次结构下,因此用户 johndoe/home/johndoe 作为其主目录。通过 SSH 以交互方式登录后,您可以通过以下方式验证您的主目录是什么

      cd
      pwd
      

      (第一个命令将当前目录更改为主目录,第二个命令打印当前目录)。

    所以,对于最简单的情况,您可以这样做:

    1. 通过 SSH 登录服务器。

    2. 在某处创建服务器端存储库:

      cd /var/tmp
      mkdir test.git
      cd test.git
      git init --bare
      
    3. 退出。

    4. 将此远程添加到您的本地存储库:

      git remote add test ssh://user@server/var/tmp/test.git
      
    5. 使用这个遥控器:

      git push test master
      

    要验证 Git 在服务器上是否正常工作,只需尝试类似

    ssh user@server "git --version"
    

    plink user@server "git --version"
    

    如果您使用的是 PuTTY 而不是 Git for Windows 随附的 OpenSSH 客户端。

    【讨论】:

    • 嗨@kostix,感谢您的回答。我通读了 NathanJ 的指南,虽然这篇文章很棒。我不是 Linux 或 Git 或 SSH 专家;我对此的经验很少。我已获得 SSH 访问权限,不久前我找到了生成 SSH 密钥的指南,并生成了我的密钥。我最大的问题是 GitGUI 要求连接的物理目录路径,似乎不是 ssh://。我会玩更多。同时,我会赞成您的回答,谢谢!
    • @KobusMyburgh,我已经更新了我的答案以写下使用 SSH。
    • 您可能想查看 gitosis (github.com/tv42/gitosis),它会为您处理 git 中的所有用户管理。
    • @dtech,嗯,是的,但是 a) 我会选择 gitolite 代替(该项目不是休眠的,部署在一些引人注目的地方,该作者在Git list),和 b) 我打算尝试让 Kobus 真正了解涉及 SSH 时幕后发生的事情。
    • @KobusMyburgh,至于git gui 要求物理路径——我认为你不正确,因为它要求一个 Git URL,所以你应该弄清楚你应该使用哪个 URL,然后将其提供给git gui。或者只是使用 Git 命令添加一个命名远程(正如我在回答中显示的那样),git gui 将自动选择你的新命名远程(因为它使用相同的存储库设置)。
    猜你喜欢
    • 2010-09-27
    • 2014-03-01
    • 1970-01-01
    • 2021-07-03
    • 2011-03-04
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多