【问题标题】:Upload unfinished work上传未完成的作品
【发布时间】:2015-11-15 09:44:27
【问题描述】:

我经常遇到这个问题(这个工作流程在 python 上很有意义):

  1. 在本地进行更改(通常只需几行)
  2. rsync 到登台服务器
  3. 在那里进行测试
  4. 如果不起作用,请转到步骤 1
  5. 如果有效,则提交、推送并进入睡眠状态

注意:我真的不想提交我的工作:这是几行代码,在登台服务器上测试它之前我根本不知道它是否有意义

我做了我讨厌的第 2 步(rsync 不是那么容易使用 - 时间戳、删除文件、权限等等),因为 git 不允许我在未提交的工作中移动。

我知道我可以准备补丁或捆绑包,但这些都不是正确的解决方案,因为这比 rsync 还要复杂。如果除了patchbundle 之外别无选择,我会坚持使用 rsync。

有没有办法像这样轻松地使用 git 来处理未提交的工作?

devel $ git upload # uploads non-committed work to the remote
staging $ git download # downloads non-committed work from the remote

我猜不是,但我不得不问......

注意

git stash 接近我想要的,但 AFAIK 无法推送存储。否则我会:

devel $ git stash
devel $ git push # push the stash stack (not really possible with git)
staging $ git pull # get the stash stack (not really possible with git)
staging $ git stash pop

【问题讨论】:

  • 叮咚! Git 不是部署工具。
  • 你可以将工作提交到一个单独的分支并推拉它。
  • @hek2mgl: git 是它可以做的任何事情......
  • @jeckyll2hide 你可以用显微镜敲钉子,但使用合适的工具会更容易。但如果你真的想使用 git,那么 google 'git push stash stack'。我相信你可以将 stash 推送到远程
  • 其他评论者通常关注为什么 Git 不是做你想做的事的好工具。他们是对的,但 IMO 他们错过了更大的图景。根据我的经验,在我的本地机器上拥有一个功能齐全的开发实例是非常有益的。您是否有任何理由必须在服务器上测试您的更改?像 VagrantDocker 这样的工具使在类似服务器的环境中进行本地开发比以往任何时候都更加容易。

标签: git


【解决方案1】:

您的问题似乎是一个对测试完全无用的开发环境。必须将每一个微不足道的代码更改部署到登台服务器,即使您“在登台服务器上测试它之前根本不知道它是否有任何意义”,那么它不应该转到登台服务器。

尝试以一种可以在开发环境中测试代码的方式设置您的开发环境,并确保在将其移动到另一台服务器之前它至少可以正常工作(无论您是否使用 rsync、git、ftp ,复制和粘贴或其他)。

只能使用您假设正在运行的代码来推送到暂存环境,以便可以在新环境中对其进行测试,并确保在将其部署到生产环境之前实际上在那里工作环境。

允许您立即测试更改的开发环境在软件开发中具有重要价值。这不仅仅是您每次测试更改时节省的一分钟部署时间(尽管仅此一项可能很快就弥补了这一点)。它还可以提高您的注意力,因为编写代码和测试代码之间的时间更少。此外,它鼓励您更频繁地测试您的代码。从长远来看,花几个小时建立一个合适的开发环境确实是有回报的。

【讨论】:

  • 我将给你一个真正的理由,为什么这并不总是适用。我正在服务器中设置 jenkins CI。为此,我有一个 shell 脚本,当然,它是在我的本地机器上编写的。我非常有信心脚本是正确的,但还没有在我的本地机器上运行它(我不希望 jenkins 安装在我的本地机器上!)。所以我想在 jenkins 服务器中运行它:我可以 rsync 到它,或者我可以 git upload 到它(我更喜欢但不存在)。我无法在本地机器上测试脚本,因为我不希望它在我的本地机器上运行。
  • 你听说过Vagrant吗?
  • @jeckyll2hide 你确实希望它在你的本地机器上运行。如果您害怕损坏,请考虑在虚拟机中设置 Jenkins,并在虚拟机和主机操作系统之间与您的脚本共享目录。
  • 1) 我的本地机器和 CI 服务器不同。 2) 我愿意做法官,愿不愿意!我告诉你:我不想要它。我想要什么(真的,我知道我想要什么):一种快速而肮脏的推动工作目录的方式。如果 git 不给我,我坚持 rsync。
  • @hek2mgl:当然,还有 docker、virtualbox、xen、and and and。但这不是我要问的。我想要一种快速而肮脏的方式来推送一个工作目录,ala rsync。
【解决方案2】:

不,你不能使用 Git。 但是,当您只是在探索新的解决方案而不是尝试在控制版本系统之外工作时,创建新分支可能更有意义。 那么我问你:为什么有人会在这样的控制系统之外工作?跟踪您的错误和/或成功不是很难吗?

【讨论】:

  • 事实上,有足够多的错误导致它在没有意识到的情况下进入 repo。我真的不需要跟踪我正在尝试的每一件小事。将其推向极端:为什么我什至要提交实际上是语法错误的一行更改?我需要在服务器上检查它。我可以在其他地方跟踪有趣的陷阱(可能在“经验教训”组织文件中)
  • @jeckyll2hide 只要你在一个单独的分支上工作,仅用于你的开发,你可以提交,推送你喜欢的任何破碎的,未完成的状态,如果你想在之后更改提交。这就是我在功能开发阶段使用 git 的方式:提交一些奇怪的状态,消息:“foobar,我今天累了”。推! .. 第二天我继续对昨天未完成的提交进行 rebase,或者更简单: git comit --amend.
  • @hek2mgl:分支 + 结帐 + 推 + 拉 + 删除分支 vs rsync。猜猜我会选择什么!
  • 我没有得到那个评论。
  • @jeckyll2hide 我们还需要git tetris 来应对我们无聊的情况。我想说的是,遵循 UNIX 编程的原则,一个工具应该解决某个目的。既然可以使用rsync这个强大的文件传输工具,为什么git要尝试复制这个功能呢?它是一个版本控制系统。顺便说一句,有趣的事实是git 可以使用 rsync(在其他人旁边)进行文件传输,这意味着它可以为您完成这项工作。您只需要使用 git 的功能 - 并按照我们的建议进行分支。
【解决方案3】:

如果你想用 git 来做这件事,我可以看到 2 种不同的方法:

  • 存储您的“未提交”(当您存储某些东西时,git 实际上会创建一个提交)更改并将存储推送到远程。见this answer for details
  • 制作补丁并将其应用到服务器上。见this answer

但我强烈建议您使用其他工具,甚至考虑使用 Vagrant 在您的机器上设置开发环境。

【讨论】:

  • 如前所述,存储接近,但工作流程过于繁琐。共享存储看起来比共享补丁或捆绑包更复杂。 rsync 更容易。
  • @jeckyll2hide 制作了一个简单的 bash 脚本,所以它就像在 shell 中输入 rsync 一样简单
  • 是的,我已经有了。尽管如此,仍然希望在 git 中提供该功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多