2014-01-22 33 views
1

我有一个CI构建定义(TFS 2013),由提交到几个分支(它是一个git存储库)触发。我想在构建过程中使用分支名称将结果复制到正确的位置。我怎样才能做到这一点?在TFS内部获得git分支名称

回答

3

使自己的CodeActivity就像这个...

您需要的IBuildDetail BuildDetail为InArgument。

string branch = null; 
string commit; 

var environmentVariable = BuildDetail.Get(context); 
if (environmentVariable != null && !BuildSourceVersion.TryParseGit(environmentVariable.SourceGetVersion, out branch, out commit)) 
{ 
    var defaultSourceProvider = environmentVariable.BuildDefinition.GetDefaultSourceProvider(); 
    if (BuildSourceProviders.IsGit(defaultSourceProvider.Name)) 
    { 
     branch = BuildSourceProviders.GetProperty(defaultSourceProvider.Fields, BuildSourceProviders.GitProperties.DefaultBranch); 
    } 
} 

if (string.IsNullOrEmpty(branch)) 
{ 
    throw new Exception("Could not find Branch"); 
} 

Branch.Set(context, branch.Substring(branch.LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase) + 1)); 
+0

感谢您的回答!我想这会起作用。最后,我选择了脚本,但如果我们决定更多地使用TFS基础架构,我将会很快使用您的解决方案。 –

+0

这很好。在F#中,我使用了'let _,branch,commit = BuildSourceVersion.TryParseGit x.SourceGetVersion'。作为SourceLink.Tfs中的扩展添加。 https://github.com/ctaggart/SourceLink/commit/058e071583578d22bcb2e0a87ede4c7b382b4279 –

+0

你打开'GitTemplate.xaml'并添加一个代码活动,只是在这里代码这个代码? –

1

有整个构建过程中.git文件夹访问,这样我就可以考虑使用PowerShell中的文件.git/HEAD。可能只有提交hash(detached HEAD机制),然后需要一些更多的git调用来找出我真正的位置。总而言之,其他答案可能更清洁。

+0

嗨Lukáš,你是否设法从.git/HEAD中找到分支名称?如果创建自己的CodeActivity,我更喜欢这个解决方案。谢谢。 – Chatumbabub

+1

你好,你可以使用'git branch --all --contains'获取当前提交的所有分支名称,这对于你的用例来说已经足够了。 –