在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 Filegit 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 脚本,它将小写当前目录下具有 inctxt 文件扩展名的任何文件的名称:

#! /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中将文件批量重命名为小写的主要内容,如果未能解决你的问题,请参考以下文章

linux批量修改目录或者文件名

Bat批处理:批量重命名包含指定名称文件夹里的指定文件

如何使用终端批量重命名文件?

使用 shell 脚本批量重命名

dos 文件重命名

sh 在Mac OSX中将所有文件重命名为小写