在 git repo 中用字符串重命名和替换

renaming and replacing by string in git repo

我正在做一个名为 XXX 的项目。 我想将 XXX 的 every 个实例替换为 YYY。 (我希望替换所有文件中的字符串,并将包含字符串 XXX 的 files/directories 重命名为 YYY)。

我做了什么以及我卡在哪里:

git checkout -b renameFix

// in zsh

sed -i -- 's/XXX/YYY/g' **/*(D.) // replace

zmv '(**/)(*XXX*)' '${2//XXX/YYY}'  // rename files and dirs

现在,当我 运行 git 状态时,我收到“致命:未知索引条目格式 0x2f700000”错误。

我可以使用其他方法吗?

你的问题是你的 glob (**/*(D.)) 遍历了 .git 目录。

您可以删除 D 限定符,以避免出现“隐藏”文件(以句点开头的文件),或者添加另一个限定符以过滤掉以 git 开头的文件。

类似这样的方法可能有效:

ignore_git() { ! [[ $REPLY =~ "^.git" ]] }
printf '%s\n' **/*(D.+ignore_git)

我添加了 printf 以便您可以验证是否列出了所需的文件。

您还可以查看 git ls-files,它可以生成 git 跟踪的文件列表。