以编程方式检测从C#代码中检出的当前git分支

时间:2014-03-14 18:39:14

标签: c# git version-control github web-config

是否可以通过C#代码在构建时确定当前签出的分支在git存储库中的内容?如果是这样的话?

最终,在主git分支上,我希望我的web.config文件中的连接字符串指向生产服务器,我希望我的开发分支始终指向开发服务器。我可以使用--assumed-unchanged在文件上设置一个git标志,但是......不应该假设web.config文件将保持不变,因为项目中有许多其他合法的更改可能导致配置文件改变,我们希望在回购中跟踪这些变化。我们不希望每次发生这种情况时都必须更新索引或切换此git标志。另外I've seen other solutions that alter the web.config file based on the build using transformations但是这不是一个可行的解决方案,因为我希望所有构建(调试和发布)始终指向每个给定分支的同一服务器。配置文件应该使其连接字符串指向不同服务器的唯一时间是基于当前检出的分支。

所以这里的想法是,如果我们可以通过C#代码检测当前检出的git分支,那么我们可以在构建时使用System.Configuration和System.Web.Configuration命名空间修改连接字符串。如果这是可能的话,那么它开辟了一个可能性的世界,以便更好地无缝地管理分支的工作流程,关于它指向哪些服务器,同时不会忘记对配置文件做出的其他重要更改。

如果我们能找到实现此方法的方法,那么克隆或分叉我的存储库的任何人都会默认自动获取此配置设置。

这甚至可能无法实现,但我感谢任何提前知道如何在C#中实现这一目标的人

2 个答案:

答案 0 :(得分:6)

ngit是JGit到C#的端口:

https://github.com/mono/ngit

你可以用JGit做你想做的事:

new FileRepository (some dir).getBranch ()

这些方法存在于NGit中,所以我想你可以在C#中做同样的事情。

答案 1 :(得分:5)

使用 LibGit2Sharp ,a.Net绑定到 libgit2 项目:

using (var repo = new Repository("path/to/your/local/repo"))
{
   Branch checkedOutBranch = repo.Head;
   Console.WriteLine(checkedOutBranch.CanonicalName); // "refs/heads/master" for instance
   Console.WriteLine(checkedOutBranch.Name);          // "master" for instance
}