5

在我的公司,我们有一个颠覆服务器,每个人都在他们的机器上使用颠覆。但是我想使用 git,在本地提交更改,然后在我准备好时“推送”它们。

但是,我无法理解在以下情况下会发生什么。假设我在本地进行了 3 次 git 提交,现在我准备好“推送”颠​​覆服务器上的所有内容。如果我理解正确的话,git svn dcommit基本上应该在服务器上按顺序进行 3 次提交,对吧?但是,如果与此同时(假设在第二次和第三次提交之间)我的另一个同事发布了一个提交,会发生什么?我能想到的场景是:

1)git 类型的“锁定”(这甚至可能吗?)提交期间的颠覆服务器,以便我的提交是原子的,而我的同事的提交是在我的之后完成的

2)服务器上的提交历史变成 mine1-mine2-other-mine3 (即使“其他”应该失败,因为我的同事当时没有更新的工作副本)。

我认为它是#2,但也许提交速度如此之高以至于这很少成为问题。那么哪个是#1 还是#2?

4

2 回答 2

5

Git 不支持无锁,这不是 Git 方式(Git 方式是分支和合并)。使用 git-svn 您将获得 mine1-mine2-other-mine3 历史记录。如果您需要原子性,请查看SubGit项目(它安装在 SVN 服务器中并为 SVN 存储库创建一个纯 Git 接口)。

最近有一个类似的问题,你可能会感兴趣。

于 2012-07-03T17:06:10.523 回答
0

如果你很幸运,那么排名第二,但大多数时候你并不那么幸运。根据我的经验,当我提交大量提交而其他人提交时,通常会发生两件事:

  1. 它随着 dcommitting 您的其他更改而停止。
  2. 您会丢失尚未提交的提交。

2号真的很烦人。主要问题是您需要完全更新才能使用 git svn dcommit。这是因为 git-svn 不允许服务器即时合并修订。(因为它需要两个提交者都有一个包含两个更改的工作树)。

解决此问题的唯一方法是我在此处找到的以下步骤

  1. 打开 .git/logs/HEAD
  2. 查找您最近的提交(请注意,这些提交按“unix 时间”排序,尽管您也可以通过阅读那里的短日志找到最新的提交
  3. 确认您找到的提交是正确的: git show
  4. git reset -- 来自日志的硬哈希
  5. git svn 变基
  6. git svn dcommit

遵循此程序可让您从失败的地方起飞。我希望他们能尽快解决这个问题,但他们说这还不是他们的优先事项。

当然,如果您提交小组并与服务器建立快速连接,则不应该经常发生。(在每天积极工作和承诺的情况下,我只得到了 2-3 次,持续了 6 个月)。

于 2012-07-03T16:59:03.883 回答