管理 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 更改的常见问题和解决方案
- 如何过滤对多项目存储库中特定项目的更改?
- 您可以使用 Where-Object PowerShell 中的命令可筛选已更改的文件,以仅包含指定解决方案路径中的文件。
- 什么是 Git 子模块,它们有何帮助?
- Git submodules 允许您在存储库中包含其他存储库,从而更好地控制依赖关系和项目隔离。
- 分支机构策略如何帮助管理变革?
- 通过为每个应用程序或应用程序组创建单独的分支,您可以隔离更改并防止它们影响不相关的项目。
- 什么是 Git 稀疏结帐?
- Git sparse-checkout 让您只查看存储库中文件的子集,从而更轻松地专注于特定项目。
- 我可以在 Visual Studio 中自定义 Git 更改窗口吗?
- 是的,您可以使用用 C# 编写的 Visual Studio 扩展来自定义它,该扩展挂钩到 Git 更改窗口并应用自定义过滤逻辑。
- 如何检索存储库中的当前分支名称?
- 您可以使用命令 git -C $repoPath rev-parse --abbrev-ref HEAD 检索当前分支名称。
- 如何列出当前分支中更改的文件名?
- 使用命令 git -C $repoPath diff --name-only $branch 列出当前分支中已更改的文件的名称。
- Visual Studio 中的 Package.Initialize() 方法的用途是什么?
- 这 Package.Initialize() 方法用于初始化 Visual Studio 包并添加自定义逻辑,例如过滤 Git Changes 窗口。
- 如何在 Visual Studio 中显示工具窗口?
- 您可以使用 IVsWindowFrame.Show() 方法在 Visual Studio 中显示工具窗口。
关于管理 Git 更改的最终想法
在 Visual Studio 中管理多个项目中的 Git 更改可能具有挑战性,尤其是在切换到 Azure DevOps 后。所讨论的解决方案(包括 PowerShell 脚本和 Visual Studio 扩展)提供了过滤更改并专注于特定项目的有效方法。实施分支策略、Git 子模块和稀疏签出可以进一步简化工作流程并提高生产力。这些方法有助于保持清晰度和组织性,确保开发人员能够专注于对其当前工作最重要的更改,而不会受到不必要的干扰。