注意:昨天我在kiln.stackexchange.com上问过这个问题,但是没有得到答案,而且它正在阻碍我的工作.所以我想我会在这里试一试.
我的主要mercurial存储库中有一堆子存储库.在初始设置期间,我犯了错误.hgsub.也就是说,我将两个子存储库指向同一目录.
我应该拥有什么:
sites/1=sites/1
sites/2=sites/2
sites/3=sites/3
Run Code Online (Sandbox Code Playgroud)
我实际上有什么:
sites/1=sites/1
sites/2=sites/2
sites/2=sites/3
Run Code Online (Sandbox Code Playgroud)
愚蠢的复制/粘贴错误.我承诺错误.hgsub,没有意识到我的错误.稍后进行一些修改,在添加一些新的子库时.hgsub,我注意到了错误并将其修复了内部.hgsub.我承诺并继续前进.我已经投入了大量合理的工作,我宁愿不重做,因为我已经"修复"了这个错误.hgsub.
现在我们来解决实际问题:我在子sites/3存储库中做了一些更改,当我尝试提交主存储库时,我收到以下错误:
abort: unknown revision 'LongGUIDLookingString'
我发现这个讨论,似乎解决了我遇到的同样问题,但我无法弄清楚bos如何修复它.为了解决这个问题,我需要做什么?
相关部分.hgsubstate:
7d1e430ac5f12e00cb5bebcdf693e72db2c45732 sites/1
6eea936a5b7cfff6169f59d0dc1c8c4eb5f8412d sites/2
e2b83b301997de8add1b659d82a7ab8201bda653 sites/3
Run Code Online (Sandbox Code Playgroud) 我一直在阅读有关子存储库以及如何使用转换扩展和文件映射将现有文件夹从Mercurial存储库提取到子存储库的信息.我能成功地做到这一点.如果我有以下文件夹结构:
C:\Project
---Project\root.txt
---Project\SubFolder
---Project\SubFolder\fileinsubfolder.txt
Run Code Online (Sandbox Code Playgroud)
我可以创建SubFolder的子存储库.以同样的方式,我可以提取一切独立的存储库(在这个例子中,第二个存储库只有root.txt文件).之后,我可以将SubFolder存储库作为子存储库添加到第二个存储库.但是,尽管两个存储库都具有完整的历史记录,但这些历史记录并未链接=>将根存储库更新为较早的状态不会将子存储库置于该点应该处于的状态.更新到一致的旧版本(自动更新root和subrepo)只有在更新到已知道子库且具有.hgsubstate文件的修订版时才有效.
我想到的另一种选择就是忘记当前存储库中SubFolder中的文件,并在SubFolder中启动一个新的存储库,同时添加一个.hgsub文件.我希望在这里实现的是从这一点开始使用子存储库,但仍然有办法更新到旧版本(在分离子库之前),因为SubFolder的文件仍然在当前存储库的历史记录中.
这不起作用:当我忘记了mercurial中的文件时,在新的仓库中将其作为当前仓库中的subrepo链接并且在子流程存在之前更新为旧版本我得到此错误:
C:\Project>hg update 1
abort: path 'SubFolder\fileinsubfolder.txt' is inside repo 'SubFolder'
Run Code Online (Sandbox Code Playgroud)
这里的问题是,当更新到不知道subrepo的旧版本时,此更新想要将文件放在SubFolder中.但是这个SubFolder仍然是另一个repo(有一个.hg目录),虽然主repo没有关于它的回忆,但是更新不希望将文件放在SubFolder中,因为它是一个repo.
无论如何都可以解决这个错误,或者是否有更好的方法来切换到现有Mercurial存储库中某个文件夹的subrepo使用并保持历史记录完整(并且两个历史记录都已链接)?
我正在研究为我的组织从svn切换到mercurial的可行性,但有一个挂起我似乎无法找到解决方案.
有没有办法拉动和更新仓库和所有子目录而无需手动拉动和更新每个子仓库?
我想切换到mercurial,但如果那不可能,那么对我们来说这是不行的.
编辑:好上帝,我今天一定很累...关于SO的两个问题,我在询问后几分钟就能找到答案......
我无法让Tortoisehg(1.0)与subrepos合作
我有这样的目录结构:
root
.hg
.hgsub
.hgsubstate
Customer1
Project1
.hg
foo.txt
Project2
.hg
Customer2
Project3
.hg
Run Code Online (Sandbox Code Playgroud)
root下的.hgsub文件看起来像
Customer1\Project1=Customer1\Project1
Customer1\Project2=Customer1\Project2
Customer2\Project3=Customer2\Project3
Run Code Online (Sandbox Code Playgroud)
如果修改文件Customer1\Project1\foo.txt并从根提交它可以工作
>hg ci -m "command line commit"
committing subrepository customer1\project1
Run Code Online (Sandbox Code Playgroud)
在Tortoisehg customer1\project1中显示状态S(subrepo)但在提交时我收到一条消息
abort: customer1/project1: no match under directory!
Run Code Online (Sandbox Code Playgroud)
是不支持这种情况还是我做错了什么?
该文档说:
"TortoiseHg 1.0引入了对子库的基本支持,并且仅在提交/状态工具中.当Mercurial认为subrepo为脏时,它将作为文件列表中的特殊条目出现在提交工具中,状态为S如果子提要包含在提交的文件列表中,则子提示与其他更改一起提交,更新主存储库根目录中的.hgsubstate文件.
我对mercurial很新,我在这个主题上已经阅读了很多,但我一直无法找到明确的答案.
mercurial指南说:"为了提高效率,只要源和目标位于同一文件系统上,就会使用硬链接进行克隆(请注意,这仅适用于存储库数据,而不适用于工作目录)."
该库wiki页面说:"所有的文件和与存储库中的根目录.hg共存目录被认为生活在工作目录".
现在,要在主回购中"链接"subrepo我做:
hg init main
cd main
echo subrepo = ../subrepo > .hgsub
hg clone ../subrepo subrepo # (1)
hg add
hg ci -m "initial rev of the main repo"
Run Code Online (Sandbox Code Playgroud)
难道上述定义意味着我真正创建一个副本的subrepo时候进行(1)?? 或者我只创建一个符号链接../subrepo?根据输出ls,它是一个实际的副本.但这对我来说听起来很奇怪......如果有人能对这个问题有所了解,我会很感激.
我有一个主仓库,它有一些我不想提交的更改.
我有一个subrepo,其中包含已经提交的更改.
我想在我的主仓库中提交更改子订单修订版,而不将更改提交到主仓库中的文件.
我似乎无法做到这一点.我无法提交.hgsubstate,并对要提交的文件进行微不足道的更改,而不会将子寄存器更改提交到主存储库.
我想评估Mercurial的工作项目.但是我的大多数项目都非常依赖于svn:externals-like支持的存在.我搜索了StackOverflow并搜索了Mercurial中的相应支持.我发现的只是在Mercurial 1.3中添加了subrepo功能,但此功能的页面说:
subrepos是Mercurial 1.3的实验性功能.因此,不要在关键任务存储库中执行此操作!
我不想使用不稳定的东西.
任何人都可以了解这个功能的实际状态,以及抛光/完成它的计划以及何时称为"稳定"并为关键任务存储库做好准备?
我们的项目有几个在IT远程subrepos,他们的地址最近从移动http://host/path到http://other_host/path.一个人怎么能回到上个月的修订版,Mercurial认为可以找到subrepo http://host/path?
$ hg -v up -d 1/20/2012
Found revision 1091 from Fri Jan 20 10:22:29 2012 -0600
resolving manifests
abort: error: No connection could be made because the target machine actively refused it
$ hg --debug up -d 1/20/2012
Found revision 1091 from Fri Jan 20 10:22:29 2012 -0600
resolving manifests
<snip...>
subrepo merge 0f0f2b807811+ 0908d5249a6f 0f0f2b807811
subrepo external/our_remote_repo: both sides changed, merge with https://old_host/external/our_remote_repo:c66cf52ce1f240193190cec392d889618c09f22b:hg
using https://old_host/external/our_remote_repo
sending capabilities command
using auth.old_host.* for authentication …Run Code Online (Sandbox Code Playgroud) (以下是我在组织我正在处理的源代码时所遇到的各种复杂性的"理论MCVE".你可以将它视为一个具体的问题而且会很好,或者你可以参考它提出的一般问题并建议如何解决它们.)
假设我有代码A,B,C和D的模块.A取决于B,C,D; B取决于C; C,D不依赖于其他模块.(我松散地使用术语"模块",所以请不要在这里挑剔).
另外,在A,B,C,D的所有部分中,使用了一些相同的头文件,甚至可能是编译对象,将它们组合在一起形成第五个模块是没有意义的,因为它太小了没用 让我们foo.h成为该类别中的一个文件.
虽然所有这些模块都保存在单个整体代码库中,但一切都很好.一切都是一个副本; 在使用相同功能编译的对象之间没有链接器冲突.
问题是:如何将B,C,D中的每一个都放入版本管理的存储库中,以便:
foo.hC的双重副本和C的双重副本(一次用于A,一次用于B) - 我可能总是要确保并保持完全同步.请注意,当我有更多的时间我会编辑它以使问题更具体(即使我有点像广泛的问题).我会说,在我的具体情况下,代码是现代C++,CUDA,一些bash脚本和CMake模块.因此,面向Java的解决方案是行不通的.
version-control mercurial directory-structure subrepos mercurial-subrepos
我在一家公司工作,在那里我们创建了许多小客户特定的应用程序.我们是一些开发人员,但大多数时候每个项目只有一个开发人员.
Customer1
ProjectX
App
Tests
ProjectY
App
Tests
Customer2
Project2
Products
Product1
Common
Run Code Online (Sandbox Code Playgroud)
今天,一切都存储在一个存储库中.
这个过程很简单.
没有标记也没有分支.早期版本根据日期签出.
这个过程已经很好地服务了很多年,但目前的工具(CVS)有一些痛点
我曾私下使用Mercurial一段时间,并希望将其扩展到所有开发人员.
我可能已经把它弄错了但有一些我不明白如何在我们的组织中实施.
CVS提交只是当前文件夹,但在mercurial中它们是存储库范围.在我们的例子中,这意味着在一个文件夹中提交维护工作也会在另一个文件夹中提交尚未完成的东西.(我假设我们可以hg ci ./**在更改的文件夹中执行但是在合并时不允许这样做,至少这是文档所说的If you are committing the result of a merge, do not provide any filenames or -I/-X filters.)
Mercurial的常见做法是每个项目都有一个存储库.
每个项目一个存储库对我们来说没问题但它会产生一些其他问题,例如:
如何在中央服务器上管理多个存储库?
如果开发人员创建了一个新项目,他最终需要推动他的更改.干得好
hg push http://localhost:8000/Customer1/NewProject
使用丑陋的堆栈转储崩溃hg-webserver并挂起客户端.
我理解的方式是开发人员需要访问服务器shell以将新存储库添加到配置文件并重新启动hgweb
另一种方法是使用SSH或共享(使用SSH而不是文件共享有好处吗?)
cd Customer\NewProject
hg init
hg clone --noupdate --pull . //mercurialshare\Customer\Project
echo "[paths]" >.hg\hgrc
echo "default=//mercurialshare\Customer\Project" >>.hg\hgrc …Run Code Online (Sandbox Code Playgroud)