【问题标题】:Powershell script to call git init in all subdirectories在所有子目录中调用 git init 的 Powershell 脚本
【发布时间】:2014-01-12 05:48:33
【问题描述】:

我想在给定目录的所有子目录中初始化存储库。由于其中大约有 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"

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

【问题讨论】:

    标签: windows git powershell directory


    【解决方案1】:

    如果你不想使用 Push-Pull Location,你可以使用更简单的 poke 脚本版本

    Get-ChildItem | ? { $_.PSIsContainer } | % { git -C $_.FullName pull }
    

    【讨论】:

      【解决方案2】:

      你所要做的就是调用这个命令:

      gci c:\parent\folder | ? { $_.PSIsContainer; } | % { cd $_.FullName; git init; };
      
      1. 第一位是Get-ChildItem的别名,获取“父文件夹”的子目录和文件列表。它通过pipe 字符| 将这些项目传递给下一个命令
      2. PSIsContainer 位仅过滤文件夹的“子项”列表,以排除文件。它通过管道 | 将这些文件夹传递到下一个命令
      3. 最后一位是ForEach-Object 的别名,它为PowerShell 管道中的每个对象执行一系列任务。
        • 将当前位置设置为文件夹路径
        • 致电git init

      【讨论】:

        【解决方案3】:

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

        顺便说一句。请注意,检查 Attributes 是否等于 "Directory" 不一定足以识别目录。虽然您可以确定您将使用它来查找目录,但可能还有其他目录也设置了其他属性标志。另请参阅FileAttributes 枚举。

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

        使用 PowerShell 的管道,您也可以将这一切写在一行中:

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

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

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

        【讨论】:

        • 所以我完全是 Powershell 菜鸟,所以如果我只是在上面的示例脚本循环中使用 Push-Location,然后在我执行必要的命令后使用 Pop-Location,那会做同样的事情吗?这是一个很好的单行,但对我来说有点难以阅读。
        • 两个答案看起来都不错,但这个答案对我来说是通过修改我当前的脚本来解决的。谢谢
        • 关于目录检查的最后一个问题:如果我要像我的示例中那样以“简单”的方式进行操作,我可以将它放在 if 语句中而不是我现在拥有的吗? "if ($item.PSIsContainer)" (不过我现在查了一下,明白了“$_”的意思。)
        • 是的,这也可以。 $_ 变量只是 foreach 循环的当前项。所以这和在你的代码中使用$item是一样的。
        猜你喜欢
        • 2013-02-27
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 1970-01-01
        • 2020-05-30
        • 2013-01-15
        • 2017-12-04
        相关资源
        最近更新 更多