Powershell脚本在所有子目录中调用git init

时间:2013-12-24 00:22:39

标签: windows git powershell directory

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

但由于显而易见的原因,它不喜欢这样。

3 个答案:

答案 0 :(得分:5)

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

顺便说一下。请注意,检查Attributes的{​​{1}}相等性不一定足以识别目录。虽然您可以确定使用它来查找目录,但可能还有其他目录也设置了其他属性标志。另请参阅FileAttributes枚举。

检查目录的更好方法是检查"Directory"属性。它对于目录来说都是正确的,否则就是假的。

使用PowerShell的管道,您也可以将它们全部写在一行:

PSIsContainer

这将首先获取当前目录中的所有项目并将它们推入管道。然后将对目录进行过滤(Get-ChildItem | ? { $_.PSIsContainer } | % { Push-Location $_.FullName; git init; Pop-Location } 是过滤器),然后将对管道中剩余的每个项执行命令(?为每个项目)。因此,您致电%以转到该目录的位置,在那里拨打Push-Location,然后使用git init返回。

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

答案 1 :(得分:1)

您所要做的就是调用此命令:

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

答案 2 :(得分:0)

如果您不想使用推拉定位,则可以使用更简单的戳脚本

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