Git软件(例如Gitbox,Github,SourceTree)能否使用远程仓库而非本地仓库?

6
我喜欢使用Git软件来推送提交,但我所用的软件(Gitbox,Github,SourceTree)在添加新仓库时都需要本地仓库。 问题是,我的仓库在开发服务器上而不是本地计算机上。 那么,Git软件能否使用远程Git仓库作为开发仓库,然后将其推送到主仓库(例如Github或Bitbucket)? 否则,似乎无法使用该软件,只能通过SSH命令行进行操作。 谢谢

2
你的本地机器上有要编辑的文件吗?如果文件不在本地机器上,你如何进行开发?你能在远程机器上运行Git GUI并通过“ssh -X”隧道连接到本地机器吗? - JBCP
1
我使用一个通过SFTP编辑文件的编辑器(Mac的Coda)。所以我不需要也不想在本地机器上存储我的文件。我使用几台机器进行开发,因此不想在所有机器上设置MySQL / apache / php和每个项目的存储库,这将是一场噩梦。因此,我有一台开发机器可以从其他所有机器访问。我很惊讶git软件无法处理远程仓库作为工作版本。我不知道是否可以在远程运行git GUI,我怀疑不行,因为我没有安装x或类似的软件,它只是一个centos web服务器。 - Laurence Cope
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6
一种不依赖于前端直接操作远程仓库的解决方案是将远程仓库挂载为网络文件系统。如果您只能通过SSH访问远程机器,则可以尝试在Linux上使用SSHFS通过FUSE或在Mac OS X上使用OSXFUSE。或者根据您的偏好和设置,您可以使用SMB、NFS、DAV或其他网络文件系统。 另一种方法是将网络文件系统从开发机器导出到服务器。我这样做是为了可以同时在多台机器上挂载我的当前工作副本,以及即使我没有连接到服务器时仍然拥有我的本地工作副本。 您写道:

我很惊讶git软件不能处理远程仓库作为工作版本。

大多数Git GUI通过调用git命令来完成一些工作。为了支持远程操作,核心Git也必须这样做。它是用C和shell脚本混合编写的;所有这些都必须被重写以应对远程文件。 文本编辑器的工作要容易得多;当您打开它时,它只读取一个文件,并在保存时进行写入,而Git在执行单个操作(如提交)的过程中读取并写入许多文件。 网络文件系统意味着所有工具(包括Git在内)都可以处理您的远程文件。不是在每个应用程序中构建支持网络文件访问的层,而是在内核(或通过FUSE)中进行,然后将其视为本地文件系统,可以免费获得所有应用程序的支持。

如果git软件无法处理我的开发版本的远程仓库,那么将其添加为网络驱动器似乎是一个不错的选择。我会研究一下这个方法。谢谢。 - Laurence Cope
@LaurenceCope 我猜大多数 Git 前端界面无法远程操作,但我对它们中的大多数没有经验。实际上,我倾向于相反的方式;将本地磁盘上的开发目录导出到我正在测试的服务器上。我正好使用 SMB 来完成此操作,因为我已经在用它来做其他事情,但任何网络文件系统都应该可以工作。 - Brian Campbell
3
更新:看起来 GitHub 和 Gitbox 在远程挂载到 sshfs 磁盘的时候无法 "看到" .git 文件。我没有收到任何状态或存储库相关信息 :(。不过,在 Finder 中我可以看到 .git 文件。 - Laurence Cope
有人能够真正地使用 git 吗? - VitalyB
3
“为了使他们支持远程操作,核心的Git也必须这样做。”这完全不是真的。Git可以安装在远程机器上,软件只需通过SSH连接到该机器,执行所需的任何git命令,然后在本地更新用户界面即可。我很惊讶居然没有这样的工具存在。 - Kabir Sarin

2
请记住,Git是一种分布式版本控制系统(DVCS)。你不需要连接到远程服务器来提交代码,这是设计上的考虑。 你需要做的是拥有本地的Git仓库,将代码推送到集成服务器(实际运行代码的那个服务器)。这就像部署一样,只是你需要将其部署到测试服务器而不是生产环境。 通常通过共享Git仓库来实现。这个仓库应该是裸仓库。除了共享的裸仓库之外,你还需要一个非裸克隆的共享Git仓库,它将作为你的Apache文档根目录。 当共享仓库接收到提交时,它会让文档根仓库执行git pull。 可以使用共享仓库上的post-receive hooks来实现。 文档根仓库在特定的分支(比如develop)上进行检出。因此,即使你提交了其他分支的内容并将它们推送,服务器也不会受影响。 这使你可以设置多个部署仓库,因此你可以有另一个与其相关的prod分支,当你向其中推送内容时,它将实际更新生产代码。 它还允许你在共享分支上存储不完整/正在进行的工作,这些工作不会被部署,以便你知道你在笔记本电脑上工作的东西安全地保存在共享仓库中,即使它不能发送到测试服务器,因为它不完整并且会破坏测试服务器,使其他人无法工作或者造成其他问题。 这篇文章详细介绍了如何设置所有内容。我以前做过,效果很好。

问题是我们使用多台本地机器进行开发。无论是我的Mac或笔记本电脑,还是我的开发人员的PC和笔记本电脑或家庭等。我们不想在所有这些本地开发机器上设置Web服务器。因此,我们都访问远程DEV服务器进行工作。这意味着我们可以随时随地开发我们的系统,而不必担心我们正在开发的机器设置。我们只需要在本地机器上安装一个IDE即可。我们通过SFTP连接并进行工作。在我看来,在这个云时代,为每台使用的机器设置所有开发站点是倒退的。 - Laurence Cope
在我描述的配置中,您不需要本地服务器。您将拥有一个共享服务器,但是您不需要通过SFTP编辑其中的文件,而是进行提交和推送。共享的Git存储库将负责将文件移动到共享Web服务器。 - Gui Prá

0

经过7年,Git的目标是能够通过 VFS for Git 使用虚拟磁盘。

Git的Virtual Filesystem (曾用名GVFS)是一种开源系统,使得Git可以在企业级规模下操作。它使得使用和管理海量的Git仓库成为可能。

VFS for Git将您的Git仓库下面的文件系统虚拟化,因此当Git工具看到一个正常的仓库时,实际上这些文件并不会真正存在于磁盘中。VFS for Git只在需要时下载文件。

这还不是Git本身的一部分,但:

对于这个问题,在Git 2.22(2019年第二季度)中将引入一个 新的钩子“post-index-change” 来帮助管理这样的虚拟磁盘,当磁盘上的索引文件发生变化时会调用该钩子:这可以帮助实现虚拟化的工作树。

请查看 1956ecd 提交记录(2019年2月15日),提交者为 Ben Peart (benpeart)
(合并于 5795a75 提交记录,合并者为 Junio C Hamano -- gitster --,日期为2019年4月25日)

read-cache:添加post-index-change钩子

添加一个post-index-change钩子,该钩子在do_write_locked_index()中写入索引后被调用。

此钩子主要用于通知,并且不能影响触发索引写入的git命令的结果。

传递给钩子一个标志以指示工作目录是否已更新,以及指示skip-worktree位是否可能已更改的标志。
这些标志使钩子能够优化其对索引更改通知的响应。


0

我大约一年前遇到了这个确切的问题 - 不幸的是,我找不到任何一致可靠的答案。我谷歌了几周,认为是我的搜索词没有成功 - 尝试了各种方式。

[我们的设置是每个开发人员都有自己的开发服务器 - 将它们与机器分开意味着可以在任何地方开发网站,开发服务器可以设置为与实时环境完全相同,并且系统管理员可以将它们升级和备份 - 我完全看到了拥有单独的开发服务器与工作机器相比的优势,其中少数缺点之一是没有 Git 应用程序!]

所有依赖文件挂载或欺骗计算机以认为远程驱动器是本地的东西都适用于一般文件浏览,但是当连接不稳定时,Git 应用程序往往会出现故障。其他时候,您必须按照某种特定的方式进行操作,才能看到 git status

我知道这不是你想听到的答案,因为我曾经处于你的情况,并且非常了解你的感受,但是你能做的最好的事情就是在命令行上使用 git

我讨厌成为那些“命令行更好”的Stack Overflow回答者之一,但在这种情况下,我找不到任何一个能够满足标准,被多个开发者每天都使用的。

当时我也反对这种做法,我更喜欢漂亮、易于使用的用户界面,但自从学习了命令行和git之后,我就再也没有回头过。在家开始我的项目时,我发现自己更喜欢使用终端而非应用程序,因为我觉得很多应用程序令人困惑!

它不仅有助于你的命令行信心,而且自从使用终端以来,我的Git知识提高了十倍,因为应用程序经常隐藏了很多事情的发生。


我确实喜欢在终端中使用git命令,但是在视觉工具(Git Extensions、Beyond Compare)中检查日志/提交/差异要好得多。 - VitalyB

0
我为自己找到了一个简单的方法: 在Transmit(FTP客户端)中,有一个“将收藏夹作为磁盘挂载”的选项。 SourceTree可以与此“虚拟”磁盘一起正常工作。 但有一个限制:您只能在对代码进行所有更改并准备好进行提交/推送后才能挂载磁盘并启动SourceTree,如果在编写代码时保持SourceTree和ssh磁盘已经挂载状态是不起作用的。由于某种原因,由Transmit挂载的磁盘不会实时更新文件内容,而是在卸载/挂载操作之后才更新。

我已经在我的桌面上安装了 Transmit.app 来尝试它!我会试一试的。谢谢。 - Laurence Cope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,