使用大小写更改的文件更新 git 个存储库

Update git repository with case-changed files

由于每个开发人员的命名约定,我不得不重命名 laravel 应用程序的一堆文件,例如。 supplyController.php 到 SupplyContoller.php。文件是在 windows 上创建的,因此文件系统不区分大小写,但生产环境 VPS 有 debian/case-sensitive,因此正确命名部署非常重要。

更改已提交并推送,据我所知这是正常行为,git 存储库包含文件的小写版本。除了每个文件的 git mv 之外,是否有更好的解决方案推荐来更正回购协议?

git mv确实是你最好的选择。

您可能也感兴趣的可能是一种批量修改大量不同文件的方法?

如果是这样,那么您真正的问题可能是:如何生成一个循环以一致的方式执行各种 git mv

例如:

$ git mv controllers/abccontroller.php controllers/AbcController.php
$ git mv controllers/defcontroller.php controllers/DefController.php
$ git mv controllers/ghicontroller.php controllers/GhiController.php
$ git mv controllers/jklcontroller.php controllers/JklController.php
...

我想这在非 Windows OS 上会更容易,原因有二:shell 和文件系统确实不区分大小写(它们往往在 [=23= 之外) ]).

虽然 git mv 可以工作,但它确实需要您提供从 fileNameFileName 的映射,这可能很乏味 - 大多数尝试自动执行此操作都是错误的 -俯卧

另一方面,如果您有一个克隆,其工作树具有所需的大写字母,那么您可以从该工作树重建索引。 (以这种方式擦除索引似乎有风险;但即使出现问题,您也可以使用 reset 轻松重建索引,或者在绝对最坏的情况下,从原点恢复——这是索引的一部分分布式源代码控制点。)

因此,仓库处于干净状态(没有未被忽略的未跟踪文件,没有未暂存的更改,最好也没有已暂存但未提交的更改):

git rm --cached -r -- :/:
git add -- :/:

这里的技巧很简单:在不区分大小写的配置中,git 将理解工作树文件 MyFile 与索引条目 myFile 相同 - 所以 just 执行添加不会更改索引中的名称。但是,如果索引没有匹配的条目,那么文件名大小写将匹配工作树中当前的内容。

(似乎您是在说这不是您期望的行为;我刚刚重新测试,至少从 2.25 开始。0.windows.1 这是我看到的行为。我不不记得任何表现不同的版本。)