likes
comments
collection
share

git修改文件大小写,远程仓库出现两个大小写不同的文件。

作者站长头像
站长
· 阅读数 7

前端代码统一了代码规范,其中有一条是文件夹和文件名使用小驼峰的形式。我负责做代码规范调整,针对项目现有的代码,首先将大驼峰修改为小驼峰形式。

心想一个个改多麻烦啊,就写了个node脚本

const fs = require('fs');
const path = require('path');

function changeFirstLetterToLowercase(dirPath) {
    const files = fs.readdirSync(dirPath);

    files.forEach(file => {
        const filePath = path.join(dirPath, file);
        const stats = fs.statSync(filePath);

        if (stats.isDirectory()) {
            changeFirstLetterToLowercase(filePath);
        }
        const newFilePath = path.join(dirPath, file.charAt(0).toLowerCase() + file.slice(1));
        fs.renameSync(filePath, newFilePath);
    });
}

const currentDir = process.cwd();
changeFirstLetterToLowercase(currentDir);
console.log('所有子文件夹和子文件的首字母已经改成小写。');

完美。然后add commit push一切看起来很顺利,但是远程仓库不对劲了。 修改之前远程仓库是这样

git修改文件大小写,远程仓库出现两个大小写不同的文件。

修改之后远程仓库变成了这样

git修改文件大小写,远程仓库出现两个大小写不同的文件。

修改之后的本地文件夹是这样

git修改文件大小写,远程仓库出现两个大小写不同的文件。

奇怪。

搜了一下原因如下: 这是因为Git是大小写敏感的,即使你在本地重命名了文件,Git仍然会将原文件和重命名后的文件都视为不同的文件进行跟踪。因此,当你将重命名后的文件push到远程仓库时,Git会将原文件和重命名后的文件都上传到远程仓库中。

如何解决呢? 如果对于少量文件可以使用对文件重命名而不是直接修改

git mv <旧文件名> <新文件名>

或者修改完之后add之前执行如下命令删除旧文件名称

git rm <旧文件名>

但是我是整个项目,文件比较多,所以我选择第三种方法 首先使用如下命令将本地所有文件取消跟踪

git rm -r --cached .  

然后add commit push到远程分支,这样远程就被清空了 最后本地执行脚本,完成文件修改,push到远程仓库就好了。 但是问题是所有文件的修改记录都没了,所以适合我们这种项目刚起步的时候来做。 但是回头想想,代码规范就应该在项目开始时就制定,如果后期改动,确实得一个个修改。