批处理文件以循环通过远程 Git 分支并将每个分支中的类似 CSV 文件复制到本地目录

Posted

技术标签:

【中文标题】批处理文件以循环通过远程 Git 分支并将每个分支中的类似 CSV 文件复制到本地目录【英文标题】:Batch File to Loop Through Remote Git Branches and Copy a Similar CSV File in Each Branch to a Local Directory 【发布时间】:2021-07-02 07:26:10 【问题描述】:

我对批处理脚本非常陌生。

为了详细说明我的问题,在许多不同的远程 git 分支中都有一个特定的文件,每个 csv 文件在分支中的内容不同,但在命名约定上相似。我正在尝试编写一个循环遍历每个远程 git 分支并将该文件复制到本地目录的批处理文件。

谢天谢地,每个远程分支都遵循相同的命名约定:3 位数的 ID、下划线和单词 update(例如 018_update)。源目录具有以下命名格式:3 位 ID、空格和带空格的基于文本的名称(例如:\018 To Shreds - You Say)。

我已经能够将分支名称放入列表中,然后循环遍历每个分支名称,但现在我被卡住了。我想知道如何导航的一个问题是我是否能够在%%a 上使用通配符从远程分支名称中提取 3 位 ID 并使用它来定位目录(和文件名)也都包含其中的 3 位数字。

这是我目前所写的:

FOR /F "tokens=*" %%a  IN (
 'git branch -r --list "*???_update*" '
 ) DO (
    git checkout %%a
)
)

假设这是正确的方向,我觉得剩下的就是找到一种方法从远程分支名称(即%%a)中获取 3 位 ID 并使用它来制作通配符并找到我要复制/粘贴的文件。

提前感谢任何能够帮助我解决这个问题的人!

【问题讨论】:

help set。还有help callhelp setlocal。我会使用简单的...do @call ... 而不是括号中的多行代码块 `...do (...multi-line code block...)。 您是否使用origin以外的远程名称? 【参考方案1】:

这演示了如何将<origin>/<###_name*>形式的字符串解析为两个变量%%a%%b,然后设置_id等于分支名称的三位前缀。如果您的分支名称看起来更像<origin>/*###_name*,那么我们还有一些工作要做,稍后我可以为您提供帮助。

@setlocal EnableExtensions

@for /F "tokens=1,* delims=/" %%a  in ('git branch -r --list *???_upate*') do @call :DoIt "%%a" "%%b"
@exit /b

:DoIt
@REM Ignoring %1, corresponding to %%a, because it's the name of the remote. 
@set "_b=%~2"
@set "_id=%_b:~0,3%"
@echo _id
@REM Use _id to find your directory and file name here.
@exit /b 0

【讨论】:

以上是关于批处理文件以循环通过远程 Git 分支并将每个分支中的类似 CSV 文件复制到本地目录的主要内容,如果未能解决你的问题,请参考以下文章

Git----创建远程分支,并将文件上传到创建的远程分支上

在本地和远程重命名 Git 分支? [复制]

git 创建分支并提交到远程

Git:在本地合并远程分支

Git常用的操作指令Git强制提交本地分支覆盖远程分支Git删除远程端文件Git临时保存和恢复

[Git] 将本地分支与远程分支关联