在 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 跟踪的文件列表。
我正在做一个名为 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 跟踪的文件列表。