在构建我们的项目时,我希望将每个存储库的mercurial id嵌入到该存储库(库,应用程序或测试应用程序)的产品中.
我发现,如果您确切地知道构建他们正在使用的特定应用程序版本的内容,那么调试客户运行的应用程序将更加容易8个时区.因此,我们系统中的每个项目(应用程序或库)都实现了获取相关修订信息的方法.
我还发现能够查看应用程序是否已使用存储库中的干净(未修改)更改集进行编译非常有用.当存储库中存在未提交的更改时,'Hg id'会有用地在变更集ID中附加一个+,这样我们就可以轻松查看人们是否运行了干净或修改过的代码版本.
我目前的解决方案详述如下,并满足基本要求,但存在许多问题.
目前,对于每个Visual Studio解决方案,我添加了以下"预构建事件命令行"命令:
cd $(ProjectDir)
HgID
Run Code Online (Sandbox Code Playgroud)
我还将HgID.bat文件添加到Project目录:
@echo off
type HgId.pre > HgId.cs
For /F "delims=" %%a in ('hg id') Do <nul >>HgID.cs set /p = @"%%a"
echo ; >> HgId.cs
echo } >> HgId.cs
echo } >> HgId.cs
Run Code Online (Sandbox Code Playgroud)
以及HgId.pre文件,定义为:
namespace My.Namespace {
/// <summary> Auto generated Mercurial ID class. </summary>
internal class HgID {
/// <summary> Mercurial version ID [+ is modified] [Named branch]</summary>
public const string Version =
Run Code Online (Sandbox Code Playgroud)
当我建立我的应用程序时,将触发对所有库预生成事件,创建一个新的文件HgId.cs(没有版本控制下保持),并导致库重新编译与新的"汞ID" '版本'中的字符串.
您使用过什么托管的mercurial存储库/错误跟踪系统?
你会推荐给其他人吗?
是否有严重的缺陷,无论是在存储库托管还是错误跟踪功能,这将很难推荐它?
您是否有任何其他经历或想要分享的意见?
如果您使用过其他非mercurial托管的存储库/错误跟踪系统,它如何比较?
(如果我理解正确,这种类型的社区维基风格问题的最佳格式是每个选项一个答案,如果你有经验,如果有几个)
我一直在寻找到选项设置一个bug /问题跟踪数据库,发现了一些有价值的意见这个线程和这个.但后来我开始认为托管解决方案不仅可以解决跟踪错误的问题,还可以解决我们在世界各地的客户站点访问我们的mercurial源代码库时遇到的问题.
由于我们目前无法通过ssl服务mercurial存储库,当我在客户站点时,我必须通过VPN将我的笔记本电脑连接到我的工作网络并通过samba共享访问mercurial存储库(即使它只是两次同步一天).这在高延迟网络上速度极慢,而某些客户的防火墙则无法实现.即使我们可以在这里运行TRAC或Redmine服务器(感谢交钥匙),我也不确定它会更快,因为我们的互联网连接过度拉伸.
我希望开发人员能够能够推送/拔出远程存储库,为工程师提供服务,以便能够从远程存储库中提取,并为客户(内部和外部)提供能够提交错误的信息. /发布报告.
看看Assembla我认为'组'价格看起来合理,但在查询之后,发现每个工作区只能包含一个存储库.由于我们的每个产品可能有多达十几个存储库(主要用于库),这些存储库需要单独管理每个产品,我可以看到它很快就变得昂贵.从好的方面来看,"用户"似乎只是工作区成员,因此您可以拥有尽可能多的客户端用户(只能提交支持服务单并跟踪自己的票证的人),而不会耗尽您的用户分配.
Jira只根据用户数量收费,不幸的是,如果您希望客户用户能够跟踪他们的门票,客户用户也会计入此数量.如果您只希望客户能够提交未跟踪的问题,您可以让他们匿名提交,但这对我来说不是很专业.
通过@Paidhi建议的MercurialHosting页面,我添加了看似提供私有存储库的选项,以及我在网络搜索中找到的另一个选项.
价格按其括号内当天的网站显示.将来欢迎更正.
无论如何,根据他们网站上提供的信息,这是我的总结:
过去几次,我们遇到了一个问题,即开发人员(明确地或有效地)完成了git merge -s ours他们不应该做的事情,提交已经丢失,而且我们只是在清理工作更加复杂和时间之后才检测到这个问题.耗时.测试没有失败,因为添加测试的提交被静默地还原了他们正在测试的代码.
我想要做的是找到或创建一个总结合并的工具,通过正常合并生成类似下面的输出:
Lines Left(2b3c4d) Right(3c4d5e)
Common with base 970 930
Unique wrt base 20 50
Unique wrt other 15 45
Unique wrt merge 15 45
Common with merge 995 985
Run Code Online (Sandbox Code Playgroud)
但是,如果合并不正确,还原了许多更改,或者git merge -s ours执行了某些更改,则可能会生成如下报告:
Lines Left(2b3c4d) Right(3c4d5e)
Common with base 970 930
Unique wrt base 20 50
Unique wrt other 15 45
Unique wrt merge 15 0 !!
Common with merge 990 935
Warning: 100% of changes from 3c4d5e are missing …Run Code Online (Sandbox Code Playgroud) 在调查我最近的问题时,Sonarcloud与Travis,Maven和github失败了,我意识到我在问错误的问题.我试图解决一个症状而不是潜在的问题.
我工作的项目(eclipse /扫描)使用Github作为其存储库,使用Travis与Sonarcloud进行持续集成和代码分析.
虽然Sonarcloud分析在内部拉取请求(从分支直接推送到eclipse /扫描的拉取请求)上运行良好,但当Travis运行外部拉取请求(来自分叉回购)时,它不起作用.
根本问题在于,我们目前运行sonarcloud的方式依赖于环境变量,这些变量由于安全原因而未填充外部拉取请求:
Encrypted environment variables have been removed for security reasons.
See https://docs.travis-ci.com/user/pull-requests/#Pull-Requests-and-Security-Restrictions
Run Code Online (Sandbox Code Playgroud)
我们的存储库设置不关心Sonarcloud是否运行,但这意味着我们经常合并破坏sonarcloud规则的更改,因为我们没有意识到它们已被破坏.我们只看到这些规则在下次被直接推送到存储库的人更改时被破坏了.这将Sonarcloud发现的问题从协作者转移到提交者的负担转移了.
所以,
请注意,这个问题似乎是在Travis Public Repository之外的一步,如何添加一个对Pull请求起作用的Secure变量,它还没有答案.
git由于二进制测试文件和java .jar文件的历史包含,我们有许多存储库已经增长到难以管理的大小.
我们正准备完成git filter-branch这些存储库的操作,在它们被使用的任何地方重新克隆它们(从每个数十个到数百个部署,取决于回购)并且考虑到重写历史的问题我想知道是否可能存在任何其他解决方案
理想情况下,我想在不重写每个存储库的历史记录的情况下将问题文件外部化.从理论上讲,这应该是可能的,因为你检查相同的文件,具有相同的大小和相同的哈希值,只是从不同的地方(远程而不是本地对象存储)获取它们.到目前为止,我找到的任何潜在解决方案似乎都不允许我这样做.
从git-annex开始,我能找到解决问题的最接近的方法是如何追溯性地附加一个已经存在于git仓库中的文件,但就像删除大文件一样,这需要重新编写历史记录以进行转换原来git add变成了git annex add.
从那里开始,我开始查看git-annex不是列出的其他项目,所以我检查了git-bigfiles,git-media和git-fat.不幸的是我们不能使用git-bigfiles fork,git因为我们是Eclipse 商店并使用git和EGit的混合.它看起来不像git-media或git-fat也可以做我想要的,因为虽然你可以用外部等价物替换现有的大文件,但你仍然需要重写历史记录以删除已经存在的大文件一直致力于.
那么,是否可以在不重写历史记录的情况下缩小.git存储库,或者我们是否应该回到使用计划git filter-branch和整个重新部署的负载?
顺便说一句,相信这应该是可能的,但可能与git当前浅层克隆实现的限制相同.
Git已经为同一个blob支持多个可能的位置,因为任何给定的blob都可以在松散的对象存储(.git/objects)或包文件(.git/objects)中,所以理论上你只需要git-annex在这个级别上挂钩的东西而不是更高(例如,如果你愿意,有一个按需下载远程blob的概念).不幸的是,我找不到任何人已经实施甚至建议这样的事情.
在维护实时系统时,我发现有时需要对文件进行临时临时更改 - 更改日志记录级别,向脚本添加跟踪选项等.
当我这样做时,我的半自动机制用于查找未提交的更改和未合并的分支通常会显示误报:
通常情况下,所有这些都需要找到尚未合并的更改,但这也意味着"隐藏"临时更改的每种方式也会被阻止.
请注意,我不希望--assume-unchanged,因为同一个文件通常包含临时更改(我不想提醒)和永久更改(我这样做),并查看处理临时更改(不承诺)Git没有提出满足所有这些要求的建议.
使用Mercurial,我会考虑使用Mercurial Queues来获得我想要的东西.我会用我的临时更改创建一个补丁,然后如果我的分析实用程序找到一个补丁队列,它会弹出它们,执行分析然后再推回它们.这将有效地仅删除临时更改,仅对我认为不是临时的更改执行分析,然后重新应用这些更改.
任何更改工作目录的方法的问题在于这会影响实时系统的行为 - 例如,我们的日志记录系统每10秒左右检查一次日志记录配置的更新.
那么,我怎样才能最好地指出git某些变化是暂时的,不应该被提交和/或合并,而其他变化应该?
我们最近将SonarLint添加到我们的默认Eclipse安装中,但仅在一些新项目中使用了sonarlint.虽然我们对这些项目的sonarlint非常满意,但是对于我们所有的遗留项目都进行了自动分析默认,这会减慢Eclipse的启动速度.
我可以浏览600多个项目并添加一个.settings/org.sonarlint.eclipse.core.prefs包含的文件autoEnabled=false,但我宁愿将项目默认为false并autoEnabled=true为我们努力遵守sonarlint规则的项目添加prefs文件.
有没有办法做到这一点?
我们有一个供应商,提供访问其硬件的库.不幸的是,如果您有多个设备,则需要多次导入其库,并使用不同的dll名称.因此,我们有一吨重复的代码,我担心它很快就会成为维护的噩梦.
我们现在所拥有的是:
namespace MyNamespace {
public static class Device01 {
public const string DLL_NAME = @"Device01.dll";
[DllImport(DLL_NAME, EntryPoint = "_function1")]
public static extern int Function1(byte[] param);
Run Code Online (Sandbox Code Playgroud)
...
[DllImport(DLL_NAME, EntryPoint = "_function99")]
public static extern int Function99(int param);
}
Run Code Online (Sandbox Code Playgroud)
....
public static class Device16 {
public const string DLL_NAME = @"Device16.dll";
[DllImport(DLL_NAME, EntryPoint = "_function1")]
public static extern int Function1(byte[] param);
Run Code Online (Sandbox Code Playgroud)
...
[DllImport(DLL_NAME, EntryPoint = "_function99")]
public static extern int Function99(int param);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用的是C或C++,我只会在静态类中定义一个文件和#include它们多次,不是很好但是比替代方案好,但在C#中我没有那个选项.
如果有人对如何有效地定义工厂有任何聪明的想法,这将允许我们生成尽可能多的静态设备类,我会非常感兴趣.
谢谢,
编辑:函数原型是非常多变的,所以任何依赖它们的方法都是不合适的.感谢到目前为止的建议,我并没有如此迅速地阐述这么多想法.
在过去,使用mercurial和Visual Studio,我曾经在我的应用程序中添加mercurial changeset id,这样当用户执行Help About时,它会列出所有组件及其确切的 mercurial修订版.它还会在每次启动时将所有变更集ID记录到应用程序日志文件中.这个过程甚至允许我查看自上次提交以来是否修改了特定的工作副本(mercurial hg id指示通过在其报告的变更集ID的末尾添加+来表示脏工作副本).
这是非常有用的,因为这意味着任何时候用户报告的问题,我可以快速地建立正是他们正在使用的版本.我还可以告诉人们什么时候在快速黑客中偷偷摸摸解决问题,既没有做出改变也没有告诉我这件事.
我现在想在git托管的RCP应用程序中复制相同的工具.不幸的是,我对gitEclipse RCP应用程序开发都很陌生,所以我有点不清楚相同的技术是否会起作用.
特别是我一直无法弄清楚如何hg id使用git,如何让Eclipse构建系统调用git以创建.gitignore包含id 的d文件,以便可以将其编译到应用程序/插件中,或者如何将此信息导入"帮助">"关于"页面.
如果你已经完成了这个或类似的事情,我会喜欢你如何做到的一些指示.或者,我很乐意听到关于实现我所寻求的最终结果的替代方法的任何建议.
有点google-fu,阅读线条和实验,它看起来git rev-parse HEAD或者git rev-parse --short HEAD可能是最接近的hg id,唉,我找不到方法来表明工作副本不干净,所以看起来我会必须检查a的输出,git status --short如果它不为空,+则手动将a附加到提交哈希.
现在我只需要了解如何从Eclipse构建系统运行这些命令以及在何处注入此信息,以便它显示在About页面中.
我们已将大部分代码库从单个svn存储库移动到一组git存储库中.由于各种原因,一些工作(在现场部署的项目的旧版本)必须在旧svn分支中继续,在它们被移动到gitsubversion并从中删除之后trunk.
我刚刚在一个svn分支上完成了这样的工作,并通过执行以下操作将更改从svn存储库重新应用到git存储库:
cd <common_svn_commit_root>
svn diff -r 12344:12345 > ~/r12345.diff
gedit ~/r12345.diff
cd <common_git_commit_root>
git apply ~/r12345.diff
Run Code Online (Sandbox Code Playgroud)
但是为每个svn提交执行此操作相当麻烦,尤其是gedit步骤,我必须手动将svn路径移植到git路径中(通常通过为顶级目录名添加前缀).
尝试到目前为止提出的一些选项的一个问题是旧svn回购和新git回购的结构是不同的.这是我编辑补丁文件的原因之一.
旧的目录结构是
svn
configurations
blah
mine
blam
plugins
foo
core
mine
bar
Run Code Online (Sandbox Code Playgroud)
而新的结构是
svn
plugins
bar
git
my_git
my_config
plugins
mine
core_git
plugins
core
foo_git
plugins
foo
Run Code Online (Sandbox Code Playgroud)
我真的想知道是否有更简单的方法来做到这一点,并了解这种情况的最佳实践.