我想在给定目录的所有子目录中初始化存储库。由于其中大约有 200 个(遗留项目),我想用 Powershell 将其自动化。到目前为止,我有:

 $items = Get-ChildItem -Path "."

    foreach ($item in $items)
    {
          if ($item.Attributes -eq "Directory")
          {
              $git = "C:\Program Files (x86)\Git\cmd\git"
              & $git "init"
          }
    }

显然,我错过了使用循环中每个子目录的一行。在目前的形式中,我相信所有这些都在同一个目录(“.”)中一遍又一遍地调用“git init”,那么从每个子目录内部调用 git init 的方法是什么?有没有办法临时“cd”到每个找到的子目录中?

我尝试了一些天真的东西
& $item.Name + "\git init"

但它不喜欢那样,原因很明显。

最佳答案

您正在寻找的 cmdlet 是 Push-LocationPop-Location 。前者会将当前工作目录更改为您传递给它的任何参数。旧位置将存储在堆栈中。使用 Push-Location 更改目录后,您可以在本地执行命令,就像手动 cd 到它们一样。之后调用 Pop-Location 清栈,回到原来的目录。

顺便提一句。请注意,检查 Attributes"Directory" 相等性不一定足以识别目录。虽然您可以确定只能找到使用它的目录,但可能还有其他目录也设置了其他属性标志。另请参见 FileAttributes 枚举。

检查目录的更好方法是检查 PSIsContainer 属性。对于目录,它只会为真,否则为假。

使用 PowerShell 的管道,您还可以将所有内容写在一行中:

Get-ChildItem | ? { $_.PSIsContainer } | % { Push-Location $_.FullName; git init; Pop-Location }

这将首先获取当前目录中的所有项目并将它们推送到管道中。然后它们将针对目录进行过滤( ? 是过滤器),然后将为管道中剩余的每个项目执行命令( % 是每个项目)。所以你调用 Push-Location 到达目录的位置,在那里调用 git init ,然后使用 Pop-Location 返回。

注意:如果您使用的是 PowerShell 3,您还可以使用 Get-ChildItem -Directory 立即过滤目录。

关于windows - 在所有子目录中调用 git init 的 Powershell 脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20753197/

10-14 19:44
查看更多