如何自动创建类似于 TFS 的 Git repo 和 checkout 文件

Posted

技术标签:

【中文标题】如何自动创建类似于 TFS 的 Git repo 和 checkout 文件【英文标题】:How to automatically create Git repo and checkout files similar to TFS 【发布时间】:2021-04-20 17:49:28 【问题描述】:

我有一个自动化工具,可以在 TFS 中创建工作区,检查解决方案并根据其他输入根据需要对其进行修改。我使用 TfsTeamProjectCollection 以及 Microsoft.TeamFoundation.VersionControl.Client 类来完成大部分工作。这是我的代码所做的示例。

public void CreateWorkspace()
        
            this.teamProjectCollection = new TfsTeamProjectCollection(new Uri(AzureDeployHelperDefinitionData.TFS_URL));

            this.versionControlServer = teamProjectCollection.GetService<VersionControlServer>();

            this.BaseSourcePath = string.Format(@"blah", "blah", this.Branch);
            
            this.Workspace = this.versionControlServer.QueryWorkspaces( this.WorkspaceName, this.versionControlServer.AuthorizedUser,null ).FirstOrDefault() ??
                this.versionControlServer.CreateWorkspace( this.WorkspaceName, this.versionControlServer.AuthorizedUser, this.WorkspaceComment );

            var items = this.versionControlServer.GetItems( this.BaseSourcePath, this.version, RecursionType.OneLevel );
            if( items == null || !items.Items.Any() )
            
                throw new NullReferenceException( "Unable to get workspace items." );
            

我们现在已将所有源代码移至 Git。有没有人有在 Git 中做类似事情的经验?是否有 Git 特定的库可以用来做类似的事情。如果是这样,请您指出正确的方向吗?

我的目标是使用我创建的另一个工具(基于 c#)自动检查解决方案,并根据需要将文件添加到该解决方案中。类似于我上面在 TFS 中所做的,我现在想在 Git 中做。

【问题讨论】:

你做了哪些研究?你试过什么? 需要考虑的是,在处理 Git 命令时,shell 脚本通常更容易编写、测试和维护。您仍然可以像以前一样从脚本中调用您的程序来执行更改的“胆量”。从长远来看,这可能会为您节省大量时间和精力。 我对 Git 有点陌生,所以我仍在理解这一切,但我尝试了下面的 VssConnection connection = new VssConnection(new Uri("tfs-server:8080/tfscollection "), 新的 VssCredentials()); GitHttpClient gitClient = connection.GetClient(); GitRepository newRepo = new GitRepository() Name = "newRepo" ;等待 gitClient.CreateRepositoryAsync(newRepo, "teamProjectName"); 【参考方案1】:

Azure DevOps 中的 Git 是标准 Git。您可以使用 Git 命令从 DevOps 克隆 repo、添加文件并推送提交:

https://git-scm.com/docs/git

或者将 REST API 与 Azure DevOps 服务一起使用。 Git客户端示例,可以参考以下链接:

https://github.com/microsoft/azure-devops-dotnet-samples/tree/main/ClientLibrary/Samples/Git

using Microsoft.TeamFoundation.Core.WebApi;
using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.VisualStudio.Services.WebApi;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Microsoft.Azure.DevOps.ClientSamples.Git

    [ClientSample(GitWebApiConstants.AreaName, "items")]
    public class ItemsSample : ClientSample
    
        [ClientSampleMethod]
        public IEnumerable<GitItem> ListItems()
        
            VssConnection connection = this.Context.Connection;
            GitHttpClient gitClient = connection.GetClient<GitHttpClient>();

            TeamProjectReference project = ClientSampleHelpers.FindAnyProject(this.Context);
            GitRepository repo = GitSampleHelpers.FindAnyRepository(this.Context, project.Id);

            List<GitItem> items = gitClient.GetItemsAsync(repo.Id, scopePath: "/", recursionLevel: VersionControlRecursionType.OneLevel).Result;

            Console.WriteLine("project 0, repo 1", project.Name, repo.Name);
            foreach(GitItem item in items)
            
                Console.WriteLine("0 1 2", item.GitObjectType, item.ObjectId, item.Path);
            

            return items;            
        

        [ClientSampleMethod]
        public GitItem GetItem()
        
            VssConnection connection = this.Context.Connection;
            GitHttpClient gitClient = connection.GetClient<GitHttpClient>();

            TeamProjectReference project = ClientSampleHelpers.FindAnyProject(this.Context);
            GitRepository repo = GitSampleHelpers.FindAnyRepository(this.Context, project.Id);

            // get a filename we know exists
            string filename = gitClient.GetItemsAsync(repo.Id, scopePath: "/", recursionLevel: VersionControlRecursionType.OneLevel).Result
                .Where(o => o.GitObjectType == GitObjectType.Blob).FirstOrDefault().Path;

            // retrieve the contents of the file
            GitItem item = gitClient.GetItemAsync(repo.Id, filename, includeContent: true).Result;

            Console.WriteLine("File 0 at commit 1 is of length 2", filename, item.CommitId, item.Content.Length);

            return item;
        
    

【讨论】:

感谢您提供以上链接。 我正在寻找一种自动执行此操作的方法,类似于我在上面使用 TFS 所做的操作。我的目标是使用我创建的另一个工具(基于 c#)自动检查解决方案,并根据需要将文件添加到该解决方案 查看我在回复中提供的 Git 客户端示例链接。

以上是关于如何自动创建类似于 TFS 的 Git repo 和 checkout 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用Visual Studio 2017克隆TFS Git repo时出错400

推送到 git 存储库时避免自动工作项链接

在Visual Studio中查看类似于TortoiseHg的TFS更改集

如何在 TFS 中使用 Git

TFS 2015:如何排除某些文件夹触发使用 Git 构建

如何在git repo中grep文件?