【问题标题】:bulk rename of files to lowercase in git在git中将文件批量重命名为小写
【发布时间】:2011-11-26 18:22:41
【问题描述】:

我有一个完整的 git 存储库,我想将所有文件和目录重命名为小写。

在 Win7 上运行,我在 gitconfig 中添加了 igorecase = false 并通过 eclipse 重命名了一些文件。生成的提交现在有两个文件,一个全小写,一个大写和小写。

删除“不需要的”文件会转储不理想的版本历史...

那么实现我的目标的潜在方法是什么 - 唯一的想法是批处理/shell(不确定如何在那里执行递归目录的东西,但希望有人会好心;))

收到的任何提示都表示感谢和拥抱。

【问题讨论】:

  • “删除'不想要的'文件会转储不理想的版本历史记录......”是什么意思。 git 会跟踪“整个树”的历史记录,因此如果您提交重新区分文件名的提交,则不会丢失任何历史记录。
  • 另外,当你 git rm Filegit add file 时,如果文件相似,git 会检测到重命名,你可以在 git status 中看到。
  • 澄清一下。在本地重命名文件然后重新扫描显示没有要更改的更改。推送成功并查看源代码库(在 codebasehq 上),两个文件都出现在列表中。

标签: git renaming


【解决方案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

【讨论】:

【解决方案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/您可以删除其中一个文件,只要另一个副本在那里。不会丢失任何历史记录。
猜你喜欢
  • 2011-04-18
  • 2019-04-10
  • 1970-01-01
  • 2013-12-19
  • 2013-12-16
  • 2015-09-17
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多