独立开发者的Git工作流程(完全的Git新手)

5
我决定开始在一个我已经开发了十多年的PHP项目中使用Git。 (请不要从版本控制警察手中接受讲课!) 由于需要在我的VPS上进行复杂的设置,以满足项目的所有需求(特别是单代码库多客户端结构和安装日语版TeX以创建特殊PDF文件),所以无法在本地Windows电脑上设置开发环境。但我在服务器上有一个测试区域可以玩耍,所以这是我的开发区域。目前我使用Filezilla访问服务器,并直接将文件打开到Notepad++中,当我准备好查看我的编辑结果时,我只需保存并让Filezilla上传。当测试区域的一切看起来没问题时,我会将文件复制到生产代码库区域。是的,这样我就没有自己评论以外的修改历史,而且我必须小心,不要把bug修复与未完成的新功能混合在一起。我可以看到Git的分支对于不同升级正在进行的项目的价值。

昨天我浅尝辄止。首先我创建了一个Github账户,然后(根据教程的建议)安装了Git For Windows(带有自己的Bash和微小的GUI)和Kdiff3,并按照一些配置Git Bash的说明进行操作。尽管如此,我最终还是不得不安装另一个与我的Github账户进行接口的工具(名为Github for Windows),它似乎可以为我完成其他两个程序应该完成的所有事情。无论如何,然后我做了一项简单的任务作为我进入Github世界的第一步 - 我已经为别人的jQuery插件添加了功能,并希望与开发人员共享,所以我forked 他的repo,在我的机器上cloned它,覆盖了我之前编辑和测试过的文件,synced到我的Github账户,并发送了一个pull request。最后一句话中的所有术语都是全新的,所以我对自己能够走到这一步感到非常自豪。;)但我想我只需要Github软件,而不是Git软件 - 很难知道哪些教程是可信的。

无论如何,现在我想找出自己的工作流程,这是我真正的问题。据我所知,除了公共Github以外,将主要repo放在任何地方都需要支付费用,而我并不在乎别人是否看到我的代码(我不指望任何人能够在我的意大利面条代码的奇怪项目上工作,但如果他们愿意,那太好了)。好吧,那么接下来呢?也许是以下其中一种情况,或其他:

  1. 将代码库的分支克隆到本地电脑,对本地文件进行编辑,然后在 Filezilla 中上传文件进行测试(比我的当前工作流程多了几个点击,因为Filezilla不能自动识别本地文件和远程文件之间的关系,但这不是什么大问题)。当我满意代码时,在本地提交,同步到Github,然后从某个位置(不确定)复制文件到生产区域。

  2. 在我的VPS上安装Linux版Git,以便“本地” Git 文件位置是测试环境,并使用PuTTY通过Git进行本地提交。文件结构更简单(根本不需要在我的PC上拷贝任何内容),但使用Git会更加繁琐:

    • 我并不经常使用PuTTY,而且由于某种原因,连接经常中断,我不得不重新启动。
    • 尽管Linux命令行是Git的天然栖息地,但我可能更习惯图形界面(因为我很快就会忘记命令语法——或许是因为我的大脑年纪大了)。

    此外,由于我从未使用过在此处安装的Git程序,我不确定我是否要在服务器上使用Git还是Github。

  3. 其他一些情况,因为 #1 或 #2 都没有使用Git/Github 来管理生产文件区域,这可能是一个不错的想法,以免遗漏需要复制的任何内容。

我试图研究基于PHP的GUI与想法#2配套使用(因此我不必在日常操作中使用PuTTY),但似乎关于这种工具的讨论都假设您要创建自己的Github服务,或者“本地”克隆的存储库实际上位于本地PC上(在运行任何操作系统的xAMP上)。但也许我使用的Github软件已经足够完成所有这些 - 很难说。我还不了解Github上主要公共存储库、某处的分支(也在Github上?)、至少两组文件在我的Web服务器上(测试环境和生产区域)、Github软件、Git软件以及我坐在电脑前键盘/屏幕之间的相互作用。

所以请原谅我的新手胡言乱语,但如果有人有类似的开发情况,请问你们的工作流程是什么?或者你会为我提供什么建议?


2
简而言之,如果您需要本地设置来镜像远程设置,请查看Vagrant。 - Paul Dixon
虽然你说你不介意在Github上公开你的Git仓库,但你可以在http://bitbucket.org上拥有私有的Git仓库(最多5个开发者,如果我没记错的话)。 - Carlos Campderrós
Paul: 我尚不知道我需要什么 —— 这就是为什么我解释了我的情况。很抱歉它对你来说太长了,但我期待着听取那些确实读过它的人的建议。deceze: 很抱歉我说过:“这是不可能的”。 对于一个Linux大师来说可能是可能的,但我花了几个月的时间才在我的VPS上使其全部运行起来。 我无法将整个VPS复制到另一台“盒子”上,因此我必须安装CentOS和大部分其他软件,并保持它们的版本同步(然后保持同步)。 我甚至都不记得我是如何做到大部分操作的(特别是TeX)。只是为了离线测试似乎不值得——我错了吗? - OsakaWebbie
@Osaka 如果您无法重现您的设置,那应该是非常令人担忧的。如果任何事情发生在您的实时服务器上...你就完了?如果它运行的硬盘崩溃了(而且它总有一天会),你就只能认命了?花些时间来复制您的设置比因为硬件问题而放弃10年的工作要好得多。您可以创建脚本来自动设置服务器。这是一次性投资,回报无限。研究Ansible、Chef、Puppet或类似的工具。 - deceze
我想我太依赖主机的备份了 - 我听到你的话了,我会看看工具。我只是分散得太厉害了 - 我跟不上新的标准和期望(最多只是一个jQuery/AJAX新手,我的PHP代码还没有面向对象编程,甚至有一些页面仍然使用表格布局!),我答应用户的待办事项列表越来越长,我在系统管理员方面很薄弱(正如你们现在所推测的那样),我从来没有时间写用户文档等等。(我只是兼职志愿者,我上次正式学习是在80年代。)停止世界旋转 - 我需要赶上! :-o - OsakaWebbie
显示剩余2条评论
3个回答

3

以下是一种解决问题的方法:

你需要三个仓库:

  • 本地代码编辑仓库。[1]
  • 位于服务器上的裸远程仓库。这将不会公开显示,但你可以ssh进入其中。[2]
  • 生产环境。[3]

下面是具体实现方法:

workstation$ cd localWorkingDirectory/
workstation$ git init
workstation$ git add .
workstation$ git commit -m 'initial commit'
workstation$ ssh login@myserver
myserver$ mkdir myrepo.git
myserver$ cd myrepo.git
myserver$ git init --bare
myserver$ exit
workstation$ cd localWorkingDirectory/
workstation$ git remote add origin login@myserver:myrepo.git
workstation$ git push origin master

每次在任何分支上提交代码时,都要备份:

workstation$ git push origin BRANCH

当您准备将分支version2移入生产环境时,请执行以下操作:

workstation$ git push origin version2
workstation$ ssh login@myserver
myserver$ git clone path/to/myrepo.git productionDirectory
myserver$ cd productionDirectory
myserver$ git checkout version2

哦不!它不起作用了!最好切换回版本1!

workstation$ ssh login@myserver
myserver$ cd productionDirectory
myserver$ git checkout version1

谢谢提供的示例 - 我还不理解每个命令,但我掌握了流程的要点。您甚至提供了一种在分支上小心操作可以将开发环境转换为生产环境的方法。问题:您的第二个存储库和dev测试目录之间有什么关系?由于我将在dev目录中进行测试(包括在需要提交之前长时间进行的试错类型测试),那么如果我只在那里创建“本地”存储库呢?(即只有#2和#3而没有#1) - OsakaWebbie
1
仓库 #2 是一个裸仓库(请查阅其含义);这使得从您的工作站推送更加容易。将您的测试目录设置为仓库 #2 的另一个克隆。 - Hal Canary
哈哈!我谷歌了“裸仓库”,并且我看的第一页不仅解释得很好,而且看看评论——路易斯听起来正在做我正在做的事情!你仍然提到了我的“工作站”(可能是指我的本地PC),但现在我还没有本地开发环境,有没有理由从我的PC拉取/推送任何东西?“#1:裸仓库,#2:克隆到开发,#3克隆到生产”对我来说听起来不错。 - OsakaWebbie
2
“…有没有理由从我的电脑上拉/推任何东西?”其实没有。我喜欢使用本地编辑器,因为它更加响应迅速。这也意味着整个仓库还有一个额外的冗余副本。 - Hal Canary
1
传统上,裸仓库目录被称为 ProjectName.git。我建议使用 $HOME/repository/ProjectName.git。 - Hal Canary
显示剩余3条评论

1
你不需要Github(或任何其他中央存储库)来开始使用Git,特别是因为你是一个独立的开发者。Git直接在你自己的机器上运行,没有任何服务器组件(不像例如Subversion)。只需执行git init,然后开始提交即可。
我同意其他评论者的观点,你应该努力建立一个本地开发环境。即使需要一些努力,这肯定是值得的。这样做的一个副作用可能是你被迫解耦一些当前的硬依赖关系,从而获得更好的应用程序架构。不能轻易在开发环境中复制的事情可以用模拟服务替换。
一旦这个环境建立好了,就可以考虑编写脚本化部署过程。例如编写一个Shell脚本,将你的开发机器的代码库与生产服务器同步。有很多方法可以做到这一点,但我建议你从非常简单的方式开始,然后再重新审视你的选项(Capistrano是其中之一)。

关于脚本部署:我可以很容易地编写一个Shell脚本来同步整个内容,但是当我在开发端仍有正在进行中的事情时(这几乎总是如此),我需要小心谨慎。这就是为什么我认为Git可能能够在某种程度上帮助解决这个问题。 - OsakaWebbie
我建议你至少需要一个开发环境,尽可能地反映实时环境作为最小要求。这里没有真正的正确答案。有时候我会有多个本地虚拟机,有时候只是复制我的生产环境到AWS并使用脚本/cap来部署开发代码。通过使用不同的分支来实现开发和生产代码的分离。因此,你需要主/生产和开发两个分支。当你准备好发布开发代码到生产时,你只需要将其合并到生产/主分支即可。 - Nick
1
重新部署,一个非常简单的解决方案是编写一个脚本,在临时文件夹中创建一个新的克隆存储库,rm -rf .git,将其全部压缩并复制到服务器上,然后在那里进行提取。这样就不会出现未提交的更改。 - troelskn
@Nick:虚拟机是本地的,但AWS是一种远程服务器类型,那么在AWS上复制实时环境与我在同一台服务器上复制它以使用完全相同的工具有何不同?如果除了deceze关于安全性的观点外,这可能是一个愚蠢的问题,请原谅,但这听起来只是更多的工作。 - OsakaWebbie
一般情况下,当我开始或接手一个项目时,会先设置环境(尽可能不使用代码库),并将其保存为 AWS 上的映像。然后创建新实例就变得非常容易,只需要使用预配置的环境即可。所以,如果您已经设置了生产环境,这意味着开发环境已经配置好了等等。 - Nick
显示剩余2条评论

0

针对您目前的开发设置,我肯定会考虑使用类似capistrano这样的工具。

我能理解您可能不愿意使用终端,但它可能会帮助您更好地理解git。掌握命令并与诸如capistrano之类的系统相结合并不需要很长时间,这样您就可以轻松地将开发代码推送到您的环境中了:

git commit -a 
git push origin develop
cap deploy:dev

当我在Windows上工作时,通常会尝试使用像Sun的VirtualBox这样的虚拟机本地复制我的部署环境。这样,您可以最小化潜在的环境问题,同时仍然在本地开发。然后,您只需使用Putty连接到本地虚拟机即可。设置虚拟机和主机操作系统之间的共享,所有标准的IDE /编辑器也将正常工作。我发现这比远程设置VPS更可取,但无论哪种方法都可以。


Capistrano是一个很好的工具,但对于刚开始使用VC并且没有任何Ruby经验的人来说,我认为它可能有点过度。一个简单的shell脚本可能是一个更好的起点。 - troelskn
这是正确的,但我认为这只涉及到一小部分命令和选项,而不是学习bash/ssh/scp等等。但这是一个有效的观点。 - Nick
我甚至没有安装Ruby。此外,我只有一个部署我的代码的地方(它是一个单一代码库服务,而不是多安装Web应用程序),所以它不会非常有用。 但我同意我可能需要使用命令行来了解Git - 我从教程中得到了这种印象。那么我应该将我的测试环境设置为存储库的位置吗? - OsakaWebbie
如前所述,GitHub并非必需,但它和其他服务确实可以简化事情。Git repo本质上是独立的,但如果您想通过git在远程服务器上更新代码,则需要使用GitHub(或您自己的服务器/其他服务)。然而,使用类似scp/rsync/ftp之类的工具将此代码上传同样容易。问题在于您的本地repo对开发vps的可用性。由于它始终需要从您认为权威的地方“拉取”,因此会出现问题。 - Nick
@nick - 或者你可以直接通过ssh将代码推送到生产服务器,而不是从服务器拉取。使用git over ssh非常简单。 - troelskn
我目前在思考是否可以将我的“本地存储库”实际上放在我的VPS上 - 如果是这样,它将非常适用于开发目录。 (仅澄清一下:开发和生产区域只是同一服务器上相邻的目录,具有略微不同的虚拟主机规则 - 它不是两个服务器。)如果我这样做,git就足够了吗?或者你的第二句话意味着如果我不在存储库所在的计算机旁边,我需要github吗? - OsakaWebbie

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