首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git- filter -repo多个操作(regex过滤器,移动文件,保存其他dir.)

git- filter -repo多个操作(regex过滤器,移动文件,保存其他dir.)
EN

Stack Overflow用户
提问于 2022-01-15 09:55:46
回答 1查看 537关注 0票数 1

我正在尝试用git-filter-repo过滤一个存储库。我试图通过在一个路径文件中描述所有需要的操作来做到这一点,正如文档中所描述的那样,在--paths-from-file节中将使用这些操作,但我仍然停留在最后一步,以便在一个简单的步骤中完成这一操作。

形势和预期结果

我的git工作目录如下所示:

代码语言:javascript
复制
$ tree
.
├── 00_a_playbook.yml
├── 01_other_playbook.yml
├── 01B_screw_that_fixed_numbering.yml
├── 02_playbook_2_which_is_now_3.yml
├── [...some more badly numbered playbooks...]
├── ansible.cfg
├── doc
│   ├── [...a bunch of docs...]
├── group_vars
│   ├── [...a bunch of var files...]
├── inventory
│   ├── [...a bunch of inventories...]
├── README.md
├── requirements.yml
└── roles
    └── my_role
        ├── [...all my role content...]

我想做的是:

  1. playbooks目录根目录下重命名所有已编号的剧本,删除它们的编号。
  2. 只保留roles和新创建的playbooks dir在回购的根。

因此,预期的树是:

代码语言:javascript
复制
.
├── playbooks
|   ├── a_playbook.yml
|   ├── other_playbook.yml
|   ├── screw_that_fixed_numbering.yml
|   ├── playbook_2_which_is_now_3.yml
|   ├── [...rest of un-numbered playbooks...]
└── roles
    └── my_role
        ├── [...all my role content...]

什么起作用

实际上我成功了,但是我需要运行这个工具两次才能得到预期的结果。

如果我创建以下两个路径文件:

  • ../paths_rename_playbooks.txt regex:^\d{2}.?_(.*.yml)$==>剧本/1
  • ../paths_keep_folders.txt角色/我的角色剧本

然后跑:

代码语言:javascript
复制
git-filter-repo --paths-from-file ../paths_rename_playbooks.txt
git-filter-repo --paths-from-file ../paths_keep_folders.txt

我得到了我所期望的和上面描述的。

在单个文件中分组路径指令失败

当我尝试从单个文件执行所有上述操作时,它将失败。

代码语言:javascript
复制
# 2 above files merged in one
$ cat ../all_paths.txt
regex:^\d{2}.?_(.*\.yml)$==>playbooks/\1
roles/my_role
playbooks

# Single run with that file. No errors
$ git-filter-repo --paths-from-file ../all_paths.txt

$ tree
.
└── roles
    └── my_role
        ├── [... my role content ...]

如你所见,我重命名的剧本文件不见了。我是在描述这些操作时遗漏了什么,还是除了迭代地运行这个工具来获得我想要的东西之外,我别无选择?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-15 10:16:19

赛尔夫回答说出了问题,帮助我发现了这个问题。我错过了关于路径重命名的文档中一个重要的音符。

注意:如果将路径筛选与路径重命名结合起来,请注意重命名指令没有选择路径,它只说明如何重命名使用筛选器选择的路径。

因此,在重命名它们之前,必须描述在原始回购中选择的所有路径。因此,在我的例子中,正则表达式必须定义两次:一次是简单的路径过滤器,另一次是重命名。下面的路径文件在一次运行中完成了该工作:

代码语言:javascript
复制
$ cat ../paths.txt
# Paths to be kept
regex:^\d{2}.?_.*\.yml$
roles/my_role

# Rename playbooks
regex:^\d{2}.?_(.*\.yml)$==>playbooks/\1

$ git-filter-repo --paths-from-file ../paths.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70720401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档