当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 控制 Git

作者:精品下载站 日期:2024-12-14 07:54:25 浏览:14 分类:玩电脑

使用 PowerShell 控制 Git


上周,我在 Twitter 上看到了有关 git 相关问题的讨论。这个故事的简短版本是,这个人的磁盘空间不足,但不明白为什么。结果这个人有几个使用 git 的开发项目。所有更改跟踪和其他相关活动都存储在隐藏的 .git 文件夹中。该文件夹中的数据量已经失控。这不一定是意外行为。事实上,您可以而且应该定期运行 git gc 来执行基本的内务处理。那部分很容易。我有很多 git 管理的项目。我更感兴趣的是确定文件夹有多大。因为 git 使用隐藏文件夹,所以很容易忘记它。我编写了一个 PowerShell 函数,这样我就不会这样做了。

基础

在创建任何函数时,我始终建议从一个或一组命令开始,您可以在交互式会话中运行这些命令,以实现您所需目标的本质。在这种情况下,获取文件的目录列表并确定总大小非常简单。

Get-ChildItem -Path C:\scripts\PSScriptTools\.git -file -Recurse | Measure-Object -Property Length -sum

[玩转系统] 使用 PowerShell 控制 Git

现在我知道这个表达式是有效的,我可以用它作为我的函数的基础。我已经有了完整的 cmdlet 和参数名称,所以这是一个优点。现在考虑一下我打算如何使用它。

我知道该文件夹将始终被称为 .git。我很可能会传递父目录路径,如果 .git 存在,则运行计算。这意味着我可以定义一个 Path 参数并将其配置为接受管道输入。

[Parameter(Position = 0, ValueFromPipeline, ValueFromPipelinebyPropertyName)]
[alias("pspath")]
[ValidateScript( {Test-Path $_})]
[string]$Path = "."

请注意,我还创建了一个别名,pspath。这是因为我的大多数存储库都位于 C:\Scripts 下,并且我希望能够运行 dir c:\scripts -directory 并通过管道传输到我的函数。根据经验,我发现如果定义 pspath 别名,工作起来会容易得多。

有了路径,我就可以构建一条测试路径。

$full = Convert-Path -Path $Path
$git = Join-Path -Path $full -childpath ".git"

我正在转换路径,以便获得完整的文件系统路径。我为 $path 设置了默认值“.”,并且希望能够将其转换为完整的文件系统名称。另请注意 Join-Path 的使用。没有理由使用串联来构建路径。这很容易搞砸,我个人认为这是初学者的标志。

让我指出本文的真正目的是我如何构建这个函数以及我使用的技术。最终结果很有用,但不是我这篇文章的目标。有大量 git 和 PowerShell 相关工具可用。

功能输出

当您创建 PowerShell 函数时,它应该只做一件事,并且只将一种类型的对象写入管道。通过这个函数,我决定创建一个简单的对象。

[PSCustomObject]@{
    Path  = $full
    Files = $stat.count
    Size  = $Size
} #customobject

我只希望在本地运行它,所以我认为我不需要 Computername 属性。我想我可以添加一个 DateTime 属性。如果我正在记录,这可能会派上用场。我可以像分支一样从 git 获取数据。但这开始转向一组不同的要求。我需要这个函数的只是指示文件夹有多大,这样我就知道是否需要运行git gc

未雨绸缪

也就是说,我为我的函数添加了一项附加功能。 Measure-Object 提供一个以字节为单位的值。嗯,我不太擅长一眼就看出某个东西是 100KB 还是 100MB。通常,我会告诉人们不要在函数中包含任何类型的格式或数据操作。我可以轻松地将输出传输到 Select-Object 并创建一个自定义属性,将总和除以 1KB 或 1MB。然而,我不断地告诉 PowerShell 工具制造者,你必须考虑谁将使用你的工具以及如何使用。在这种情况下,是我,我知道很可能希望看到字节以外的值。所以我添加了一个 $As 参数。

[ValidateSet("kb", "mb", "gb")]
[string]$As

另请注意,我正在使用参数验证技术。我将参数选择限制为这 3 个选项。更好的是,因为我使用的是 ValidateSet,PowerShell 将使用这些值进行制表符补全!

功能

目前,完整的功能已在 Github 上发布。

https://gist.github.com/jdhitsolutions/cbdc7118f24ba551a0bb325664415649

我对此功能还有一些其他计划。但现在我可以用它来检查单个文件夹。

[玩转系统] 使用 PowerShell 控制 Git

或者我可以检查整个目录。

dir c:\scripts -directory | get-gitsize | Out-GridView -Title "Git Report"

[玩转系统] 使用 PowerShell 控制 Git

通过一些额外的努力,我可以构建一个简单的控制脚本。

dir c:\scripts -Directory | Get-GitSize | where-object {$_.size -ge 25MB} |
Out-GridView -Title "Select repos to compress" -PassThru | foreach-object {
set-location $_.Path
git gc --aggressive
}

关于如何使用它,您可能有其他想法。如果是这样,我希望你能分享。享受。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯