Update clean-repos.ps1

This commit is contained in:
Markus Fleschutz 2023-10-15 12:01:45 +02:00
parent 51947ab13d
commit 2731540147

View File

@ -3,46 +3,50 @@
Cleans all Git repositories in a folder from untracked files Cleans all Git repositories in a folder from untracked files
.DESCRIPTION .DESCRIPTION
This PowerShell script cleans all Git repositories in a folder from untracked files (including submodules). This PowerShell script cleans all Git repositories in a folder from untracked files (including submodules).
.PARAMETER ParentDir .PARAMETER parentDir
Specifies the path to the parent folder Specifies the path to the parent folder (current working dir by default)
.EXAMPLE .EXAMPLE
PS> ./clean-repos C:\MyRepos PS> ./clean-repos.ps1 C:\MyRepos
(1) Searching for Git executable... git version 2.40.1
(2) Checking parent folder 📂Repos... 28 subfolders found
(3/30) Cleaning 📂base256unicode...
...
.LINK .LINK
https://github.com/fleschutz/PowerShell https://github.com/fleschutz/PowerShell
.NOTES .NOTES
Author: Markus Fleschutz | License: CC0 Author: Markus Fleschutz | License: CC0
#> #>
param([string]$ParentDir = "$PWD") param([string]$parentDir = "$PWD")
try { try {
$StopWatch = [system.diagnostics.stopwatch]::startNew() $stopWatch = [system.diagnostics.stopwatch]::startNew()
Write-Host "⏳ (1) Searching for Git executable... " -noNewline Write-Host "⏳ (1) Searching for Git executable... " -noNewline
& git --version & git --version
if ($lastExitCode -ne "0") { throw "Can't execute 'git' - make sure Git is installed and available" } if ($lastExitCode -ne "0") { throw "Can't execute 'git' - make sure Git is installed and available" }
$ParentDirName = (Get-Item "$ParentDir").Name $parentDirName = (Get-Item "$ParentDir").Name
Write-Host "⏳ (2) Checking parent folder 📂$ParentDirName... " -noNewline Write-Host "⏳ (2) Checking parent folder 📂$parentDirName... " -noNewline
if (-not(Test-Path "$ParentDir" -pathType container)) { throw "Can't access folder: $ParentDir" } if (-not(Test-Path "$ParentDir" -pathType container)) { throw "Can't access folder: $ParentDir" }
$Folders = (Get-ChildItem "$ParentDir" -attributes Directory) $folders = (Get-ChildItem "$ParentDir" -attributes Directory)
$NumFolders = $Folders.Count $numFolders = $folders.Count
Write-Host "$NumFolders subfolders found" Write-Host "$numFolders subfolders found"
[int]$Step = 2 [int]$Step = 2
foreach ($Folder in $Folders) { foreach ($folder in $folders) {
$FolderName = (Get-Item "$Folder").Name $FolderName = (Get-Item "$folder").Name
$Step++ $Step++
"⏳ ($Step/$($NumFolders + 2)) Cleaning 📂$FolderName..." "⏳ ($Step/$($numFolders + 2)) Cleaning 📂$FolderName..."
& git -C "$Folder" clean -xfd -f # force + recurse into dirs + don't use the standard ignore rules & git -C "$folder" clean -xfd -f # force + recurse into dirs + don't use the standard ignore rules
if ($lastExitCode -ne "0") { throw "'git clean -xfd -f' failed with exit code $lastExitCode" } if ($lastExitCode -ne "0") { throw "'git clean -xfd -f' failed with exit code $lastExitCode" }
& git -C "$Folder" submodule foreach --recursive git clean -xfd -f & git -C "$folder" submodule foreach --recursive git clean -xfd -f
if ($lastExitCode -ne "0") { throw "'git clean -xfd -f' in submodules failed with exit code $lastExitCode" } if ($lastExitCode -ne "0") { throw "'git clean -xfd -f' in submodules failed with exit code $lastExitCode" }
} }
[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds [int]$elapsed = $stopWatch.Elapsed.TotalSeconds
"✔️ cleaned $NumFolders Git repositories at 📂$ParentDirName in $Elapsed sec." "✔️ Cleaned $numFolders Git repos under 📂$parentDirName in $elapsed sec"
exit 0 # success exit 0 # success
} catch { } catch {
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"