在git中将文件批量重命名为小写
Posted
技术标签:
【中文标题】在git中将文件批量重命名为小写【英文标题】:bulk rename of files to lowercase in git 【发布时间】:2011-11-26 18:22:41 【问题描述】:我有一个完整的 git 存储库,我想将所有文件和目录重命名为小写。
在 Win7 上运行,我在 gitconfig 中添加了 igorecase = false 并通过 eclipse 重命名了一些文件。生成的提交现在有两个文件,一个全小写,一个大写和小写。
删除“不需要的”文件会转储不理想的版本历史...
那么实现我的目标的潜在方法是什么 - 唯一的想法是批处理/shell(不确定如何在那里执行递归目录的东西,但希望有人会好心;))
收到的任何提示都表示感谢和拥抱。
【问题讨论】:
“删除'不想要的'文件会转储不理想的版本历史记录......”是什么意思。 git 会跟踪“整个树”的历史记录,因此如果您提交重新区分文件名的提交,则不会丢失任何历史记录。 另外,当你git rm File
和 git add file
时,如果文件相似,git 会检测到重命名,你可以在 git status
中看到。
澄清一下。在本地重命名文件然后重新扫描显示没有要更改的更改。推送成功并查看源代码库(在 codebasehq 上),两个文件都出现在列表中。
【参考方案1】:
当我不得不更改 git repo 中文件的大小写时,我只使用两个重命名:
git mv aNiceClass.inc aniceclass.inc_
git mv aniceclass.inc_ aniceclass.inc
然后Git就愉快的记录了改名:
# Changes to be committed:
#
# renamed: aNiceClass.inc -> aniceclass.inc
尝试直接进行重命名会抛出此错误:
fatal: destination exists, source=aNiceClass.inc, destination=aniceclass.inc
这是一个示例 shell 脚本,它将小写当前目录下具有 inc
或 txt
文件扩展名的任何文件的名称:
#! /bin/bash
find -E . -regex '.*(inc|txt)$' | while read f
do
lc=$(echo $f | tr A-Z a-z)
git mv $f $lc_
git mv $lc_ $lc
done
这也可以用一个丑陋的小单线来捣碎:
find -E . -regex '.*(inc|txt)$' | while read f; do lc=$(echo $f | tr A-Z a-z); git mv $f $lc_; git mv $lc_ $lc; done
【讨论】:
注意:你不需要脚本,从 git 2.0.1 开始:***.com/a/24979063/6309【参考方案2】:由于标题或标签未提及任何有关操作系统的内容,因此这适用于 macOS。它对文件夹中的所有文件执行git mv
小写。如果您需要强制标志,只需在 git mv
之后添加即可。
for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
【讨论】:
谢谢@softam。虽然 OP 要求提供文件和目录”,但我需要排除目录,因此我将您的单行代码调整为 exclude 目录,以防它对某人有帮助:for f in *; do if [ ! -d "$f" ]; then git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; fi done
【参考方案3】:
首先,core.ignorecase
默认为 false。
您的提交应该列出两个文件,但一个用于删除,一个用于添加。
提交后,Git 将检测到一个已重命名为另一个
(因为 Git 的核心是 content provider)。
历史记录将被保留(即使您可能需要 git log --follow -- yourNewFile
才能获取其历史记录)
注意:git 2.0.1 现在授权一个简单的git mv a.txt A.txt
:见“Git: Changing capitalization of filenames”。
不再需要script like the one below。
【讨论】:
那我做错了什么。重命名文件后,该文件内没有任何编辑,重新扫描 repo 显示没有要暂存的更改。 @Ian: '重新扫描'?你的意思是git status
?
是的(我很懒 - 使用 gui)
@Ian:日食是否正确重命名了文件?如有疑问,每当涉及 GUI 交互时,最好回退到 CLI(命令行界面),并在 shell 会话中检查 git status
实际返回的内容。
@Ian:无论如何,如果你最终得到两个文件,a/ 这不应该是由 Git 引起的,而是由 Eclipse 引起的。 b/您可以删除其中一个文件,只要另一个副本在那里。不会丢失任何历史记录。以上是关于在git中将文件批量重命名为小写的主要内容,如果未能解决你的问题,请参考以下文章