在 Visual Studio 中处理跨多个项目的 Git 更改

在 Visual Studio 中处理跨多个项目的 Git 更改
在 Visual Studio 中处理跨多个项目的 Git 更改

管理 Git 更改简介

我们最近过渡到 Azure DevOps,并遇到了 482 个应用程序的广泛集合的可用性问题。这些应用程序被分组到存储库中,每个存储库包含多个解决方案。其中一个存储库包含 5 个应用程序,其中一个解决方案拥有 20 多个项目,其中只有一个项目在应用程序之间共享,而其他解决方案则拥有 10 到 15 个独特的项目。

当在同一个存储库中同时处理多个应用程序时,我们会遇到挑战。与 SVN 过滤更改以仅显示与解决方案中的项目相关的更改不同,Visual Studio 的 Git Changes 显示存储库中的所有更改。这会产生混乱的视图,使得很难专注于特定项目。我们正在探索有效管理这一问题的方法。

命令 描述
git -C $repoPath rev-parse --abbrev-ref HEAD 检索指定存储库中的当前分支名称。
git -C $repoPath diff --name-only $branch 列出当前分支中与指定分支相比发生更改的文件名称。
Where-Object 根据 PowerShell 中的指定条件过滤集合中的对象。
IVsWindowFrame 表示 Visual Studio 中的窗口框架,用于自定义工具窗口。
Package.Initialize() 重写 Visual Studio 包的初始化方法以添加自定义逻辑。
IVsWindowFrame.Show() 在 Visual Studio 中显示工具窗口。
Package 用于创建可扩展 IDE 的 Visual Studio 包的基类。

了解脚本解决方案

提供的 PowerShell 脚本旨在过滤 Git 更改,以仅显示与较大存储库中的特定解决方案相关的更改。它首先定义存储库的路径,并使用命令检索当前分支 git -C $repoPath rev-parse --abbrev-ref HEAD。接下来,它列出了当前分支中已更改的文件的名称,使用 git -C $repoPath diff --name-only $branch。然后,该脚本会过滤这些已更改的文件,以仅包含指定解决方案路径中的文件 Where-Object,这允许我们应用文件路径必须与解决方案路径匹配的条件。

另一方面,用 C# 编写的 Visual Studio 扩展自定义了 Git Changes 窗口来过滤和显示相关更改。它使用以下方式连接到 Visual Studio 环境 IVsWindowFrame 类,代表 Visual Studio 中的窗口框架。扩展的主要逻辑封装在 Package.Initialize() 方法,它找到 Git Changes 窗口框架并应用自定义过滤逻辑以仅显示属于当前解决方案的更改。这有助于开发人员专注于相关更改,而不会因存储库中不相关的修改而分心。

在 Visual Studio 中按解决方案筛选 Git 更改

使用 PowerShell 脚本

# Define the path to the repository
$repoPath = "C:\path\to\your\repository"
# Get the current branch
$branch = git -C $repoPath rev-parse --abbrev-ref HEAD
# Get the list of changed files
$changedFiles = git -C $repoPath diff --name-only $branch
# Define the solution path
$solutionPath = "C:\path\to\your\solution"
# Filter the changed files to include only those in the solution
$filteredFiles = $changedFiles | Where-Object { $_ -like "$solutionPath\*" }
# Output the filtered files
$filteredFiles

自定义 Visual Studio 中的 Git 更改显示

使用 Visual Studio 扩展 (C#)

using System;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
namespace GitChangesFilter
{
    public class GitChangesFilterPackage : Package
    {
        protected override void Initialize()
        {
            base.Initialize();
            // Hook into the Git Changes window
            IVsWindowFrame windowFrame = /* Get the Git Changes window frame */
            if (windowFrame != null)
            {
                // Customize the Git Changes display
                // Apply filtering logic here
            }
        }
    }
}

使用 Git 在 Visual Studio 中管理多个项目

在 Visual Studio 中管理 Git 更改的另一种方法是有效使用分支策略。通过为同一存储库中的每个应用程序或应用程序组创建单独的分支,您可以隔离更改并防止它们出现在不相关的项目中。这样,当您在分支之间切换时,只有与当前分支相关的更改才会显示在 Git Changes 窗口中。这种方法还可以实现更好的协作,因为团队成员可以在不同的分支上工作,而不会干扰彼此的工作。

此外,Git 子模块或 Git Sparse-Checkout 等工具可用于管理具有多个项目的大型存储库。 Git 子模块允许您在存储库中包含其他存储库,从而更好地控制依赖关系和项目隔离。 Git稀疏签出允许您仅签出存储库中的文件子集,从而减少工作目录中的混乱并使其更容易专注于特定项目。在处理复杂的多项目存储库时,这些技术可以显着提高生产力。

在 Visual Studio 中管理 Git 更改的常见问题和解决方案

  1. 如何过滤对多项目存储库中特定项目的更改?
  2. 您可以使用 Where-Object PowerShell 中的命令可筛选已更改的文件,以仅包含指定解决方案路径中的文件。
  3. 什么是 Git 子模块,它们有何帮助?
  4. Git submodules 允许您在存储库中包含其他存储库,从而更好地控制依赖关系和项目隔离。
  5. 分支机构策略如何帮助管理变革?
  6. 通过为每个应用程序或应用程序组创建单独的分支,您可以隔离更改并防止它们影响不相关的项目。
  7. 什么是 Git 稀疏结帐?
  8. Git sparse-checkout 让您只查看存储库中文件的子集,从而更轻松地专注于特定项目。
  9. 我可以在 Visual Studio 中自定义 Git 更改窗口吗?
  10. 是的,您可以使用用 C# 编写的 Visual Studio 扩展来自定义它,该扩展挂钩到 Git 更改窗口并应用自定义过滤逻辑。
  11. 如何检索存储库中的当前分支名称?
  12. 您可以使用命令 git -C $repoPath rev-parse --abbrev-ref HEAD 检索当前分支名称。
  13. 如何列出当前分支中更改的文件名?
  14. 使用命令 git -C $repoPath diff --name-only $branch 列出当前分支中已更改的文件的名称。
  15. Visual Studio 中的 Package.Initialize() 方法的用途是什么?
  16. Package.Initialize() 方法用于初始化 Visual Studio 包并添加自定义逻辑,例如过滤 Git Changes 窗口。
  17. 如何在 Visual Studio 中显示工具窗口?
  18. 您可以使用 IVsWindowFrame.Show() 方法在 Visual Studio 中显示工具窗口。

关于管理 Git 更改的最终想法

在 Visual Studio 中管理多个项目中的 Git 更改可能具有挑战性,尤其是在切换到 Azure DevOps 后。所讨论的解决方案(包括 PowerShell 脚本和 Visual Studio 扩展)提供了过滤更改并专注于特定项目的有效方法。实施分支策略、Git 子模块和稀疏签出可以进一步简化工作流程并提高生产力。这些方法有助于保持清晰度和组织性,确保开发人员能够专注于对其当前工作最重要的更改,而不会受到不必要的干扰。