- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们有一个包含多个项目的 SVN 存储库:
ROOT
- Project1
- trunk
- Project2
- trunk
..等等
然后我们开始迁移到 git。我们设置 subgit 以保持 SVN 和 GIT 存储库同步(双向)。几个月来,我们有一些开发人员使用 svn,一些使用 git,显然没有任何问题。
上面的每个项目都变成了一个git仓库,subgit配置为:
trunk = trunk:refs/heads/master
branches = branches/*:refs/heads/*
tags = tags/*:refs/tags/*
shelves = shelves/*:refs/shelves/*
到目前为止一切顺利。让我们从现在开始关注Project1。
我注意到最近在 svn 中完成的一些提交没有移植到 git。查看 svn 端的日志,我发现这些提交在 svn 中也处于“不一致”状态(日志部分匿名):
$ svn log -v Project1
------------------------------------------------------------------------
r6109 | user1 | 2015-01-13 12:47:43 +0100 (di, 13 jan 2015) | 1 line
Changed paths:
R /Project1/trunk (from /Project1/trunk:5477)
Branch '/trunk' replaced from /trunk:5477
------------------------------------------------------------------------
r6089 | user2 | 2015-01-08 13:46:27 +0100 (do, 08 jan 2015) | 1 line
Changed paths:
M /Project1/trunk/src/com/....
-- fix xyz
------------------------------------------------------------------------
r5978 | user2 | 2014-12-26 21:30:28 +0100 (vr, 26 dec 2014) | 4 lines
Changed paths:
M /Project1/trunk/src/com/...
-- fix abc
------------------------------------------------------------------------
[ ... more commits ... ]
------------------------------------------------------------------------
r5477 | user2 | 2014-10-16 17:07:25 +0200 (do, 16 okt 2014) | 1 line
Changed paths:
M /Project1/trunk/src/com/...
-- fix bug23
现在,最后一个commit r6109 看起来很可怕。好像说当前trunk已经被r5477覆盖了。
确实,trunk 文件夹的日志完全错过了中间的修订:
$ svn log -v Project1/trunk
------------------------------------------------------------------------
r6109 | user1 | 2015-01-13 12:47:43 +0100 (di, 13 jan 2015) | 1 line
Changed paths:
R /Project1/trunk (from /Project1/trunk:5477)
Branch '/trunk' replaced from /trunk:5477
------------------------------------------------------------------------
r5477 | user2 | 2014-10-16 17:07:25 +0200 (do, 16 okt 2014) | 1 line
Changed paths:
M /Project1/trunk/src/com/...
-- fix bug23
我需要一些帮助来确定当前状态和可能的解决方案。
我认为发生了什么(请在这里帮助我!):
git reset --hard
将工作副本重置为本地 master 分支,该分支位于与 svn r5477 对应的提交处,并将其推送给远程主机。Project1/trunk
,这里已经用r5477重写Project1
甚至没有被 subgit 看到,这解释了为什么 Project1
的历史仍然包含现在丢失的提交的日志(trunk 中的代码实际上回到了 r5477 修订版)。谁能确认这可能是当前状态?我还在忽略什么吗?我不知道 svn 可以让你(在这种情况下是 subgit)以不一致的历史结束。
如果这是真的,谁能建议最好的解决方案是什么?请注意,git 存储库没有那部分历史记录,因为它只同步 Project1/trunk
而不是 Project1
。我觉得这应该在 svn 存储库中修复。但我不知道怎么办。
以下是可能的解决方案吗?
$ cd Project1
$ svn merge -rHEAD:6089 .
$ svn ci
任何人的警告和/或更好的建议?
最佳答案
我会解释发生了什么。
Git 仓库中有一个'master' 的更新,它绑定(bind)到SVN 中的trunk。此外,更新是非快进的,默认情况下,如果没有 git push
命令的 -f
选项,Git 不允许这样的推送。非快进更新被转换为分支替换,因为这是 SVN 存储库中最接近的模拟。例如,您可以在这样之后比较 git log master
并更新相应的 svn log -v Project1/trunk
输出,看到两者都不包含 r6089,并且第一次提交列出的将是 r5477(如果我们不考虑 r6109 没有任何变化,在 Git 中没有模拟)。要在 git log
输出中查看修订号,您可以按照 SubGit book 的“4.6. 推荐的客户端 Git 配置”部分中描述的方式配置 Git 客户端。并运行 git fetch
。所以我不认为 SVN 和 Git 存储库不一致。
如果你想防止将来分支替换,你不应该使用git push -f
命令。如果您想严格禁止此类更新,您可以将服务器上 Git 配置的 receive.denyNonFastForwards
选项设置为 true
。
关于修复:有两种方法。如果您可以在您的 Subversion 历史记录中进行这样的提交,您可以再次替换您的 trunk
但来自 trunk@6089。您可以从 SVN 端执行此操作,例如分两步:
$ svn delete Project1/trunk
$ svn commit -m "Trunk deleted"
$ svn update
$ svn cp <URL of trunk>@6089 Project1/trunk
$ svn commit -m "Trunk recreated from r6089"
或者您可以从 Git 端更新它(确保您的工作树是干净的,然后再这样做):
$ git update-ref refs/heads/master <SHA-1 of r6089 commit>
$ git push origin master -f
如果您当前的分支是 master,您可能需要立即运行 git reset --hard HEAD
。
请注意,对应于 r6089 的 Git 提交不会丢失,对于没有引用的此类提交,SubGit 创建一个“阁楼”引用(以防止通过“git gc”收集它们),对于您的情况,它是 refs/svn/attic/trunk/6089
,我想,这样你就可以获取
$ git fetch origin refs/svn/attic/trunk/6089:refs/heads/trunk6089
在客户端上进行此提交。请注意,之后您几乎不会注意到 r6109 的任何证据,svn log
(以及 git log
)将直接跳过它到最后一个替换源,即替换为 r6089。
另一种(更糟糕的)方法是从 SVN 历史记录中删除 r6109(我假设您没有其他对主干的提交)。这可以通过“svnadmin dump/load”过程来完成。在服务器上运行以下命令
$ svnadmin dump path/to/your/current/svn/repository -r1:6108 > repo.dump
$ svnadmin create path/for/repaiered/svn/repository
$ svnadmin load path/for/repaiered/svn/repository < repo.dump
然后配置对这个新存储库而不是您的 SVN 存储库的访问,并为其重新安装 SubGit。某些 SHA-1 哈希值可能会有所不同。有一种方法可以保留大部分哈希值,但这取决于您的 SubGit 模式:本地或远程。
你的 merge 方法怎么样,对我来说,这会使历史变得复杂。特别是如果您 merge 整个项目而不是某些分支,那么我不会执行该 merge 。
如果您有任何问题,请随时联系 support@subgit.com
关于git - SVN 主干被旧版本覆盖。项目和主干文件夹现在有不同的历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964776/
我似乎无法让它发挥作用。我已经尝试过在线样本,但没有一个正是我需要的。基本上我希望能够显示从给定日期过去的天数。我下面的示例是 HTML 和 PHP 的组合,出于某些原因我不得不这样做。 Date
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
在此处搜索“线程关联”的答案,我发现人们对此很感兴趣,但没有什么理由可以节省可能获得稳定的 QueryPerformanceTimer 结果。 假设一个现代操作系统和一个现代 2-4 插槽工作站/服务
我有一个称为main-app的聚合物元素:
我有一个表,我想在每个插入时间记录每个订单的时间戳。但是,我得到的时间戳值为零。 这是我的架构: CREATE TABLE IF NOT EXISTS orders( orde
我正在使用 MongoDB Atlas 来托管数据库并使用这个无服务器函数查询数据: import { NextApiRequest, NextApiResponse } from "next"; /
苹果卸下了转义键,并用OLED触摸条替换了它。这对emacs用户具有影响,特别是对于具有数十年肌肉内存力才能克服此变化的UNIX/emacs用户而言。幸运的是,触摸栏逃生键似乎总是在您需要的时候出现,
抱歉,我对 DbGrids 还很陌生。 我是否应该使用查询的字段编辑器并以某种方式添加一个捕获 TIMEDIFF 的新字段,然后将其添加为我的 DbGrid 中的列? 或者我可以/应该跳过字段编辑器并
正如一本相当古老的书XUnit Patterns所写,NUnit 2.0不会为每个测试创建新的测试夹具,因此,如果测试正在操纵夹具的某种状态,则该夹具会被共享并且可能导致各种不良副作用。 还是一样吗?
我知道自2016年4月以来,Youtube API的默认配额限制为1M。 如果要增加它,我们需要向Google 发送请求。 我想知道我们可以要求的配额限制的最大值是多少? 最佳答案 根据Google开
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
{ "size": 0, "query": { "range": { "LogTime": { "gte": "now-1d",
当我尝试从终端编译这个简单的代码时: #include int main(void) { printf("%f\n",sqrt(10)); return 0; } 使用 gcc mai
我正在尝试筛选抓取一个 html 页面,以便我可以从中提取所需的有值(value)的数据并将其放入文本文件中。到目前为止,一切进展顺利,直到我在 html 页面中遇到了这个: In inventor
这是我的 结果 MySQL 表的示例: 我想将特定用户的所有日期向前移动相同的时间间隔,以便该用户的最高日期是当前时间戳。我知道如何获取以天为单位的间隔: /* result is 823 */ SE
我有一个函数需要从主视图中的几个不同位置调用。我们称它为 updateFunction。 我这样声明: - (void)updateFunction { //updates some vari
我正在尝试找出如何以某种方式嵌套回调。 var alpha = function(callback){ var x = 5; if(x > 2){ callback()
为什么我收到RangeError:超出最大调用堆栈错误?我正在尝试解析文本以找到数学并解决它。它一直有效,直到我开始实现括号'。我试图找出错误,但就是无法弄清楚。 我的代码: var alg = {
我记得几年前,没有使用 SSL 的原因之一是它占用了大量资源,因此影响了应用程序的性能。 如今,以当前的技术,这仍然是一个需要牢记的点吗? 这个问题的出现是因为一位同事担心使用 SSL 会影响他的应用
我正在将我的数据库从 sqlserver 迁移到 mysql当我在 sqlserver 中使用 getDate() 函数时,mysql 中的替换是 Now()但是 Now() 没有返回 getDate
我是一名优秀的程序员,十分优秀!