使用案例更改文件更新git存储库

使用案例更改文件更新git存储库,git,case-sensitive,case-insensitive,Git,Case Sensitive,Case Insensitive,由于每个开发人员的命名约定,我不得不将laravel应用程序的一堆文件重命名为supplyController.php,以supplyController.php。这些文件是在windows上创建的,因此文件系统不区分大小写,但生产VPS具有debian/区分大小写的特性,因此使用正确的命名进行部署非常重要 更改已经提交并推送,如果这是正常行为,git repo包含文件的小写版本。除了每个文件的git mv之外,是否有更好的解决方案可用于纠正回购 git mv确实是您最好的选择 您可能也感兴趣的

由于每个开发人员的命名约定,我不得不将laravel应用程序的一堆文件重命名为supplyController.php,以supplyController.php。这些文件是在windows上创建的,因此文件系统不区分大小写,但生产VPS具有debian/区分大小写的特性,因此使用正确的命名进行部署非常重要


更改已经提交并推送,如果这是正常行为,git repo包含文件的小写版本。除了每个文件的git mv之外,是否有更好的解决方案可用于纠正回购

git mv确实是您最好的选择

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

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

例如:


我想这在非Windows操作系统上会更容易,原因有两个:Shell和文件系统确实不区分大小写(它们往往在Windows之外)。

虽然
git mv
可以工作,但它确实需要您提供从
fileName
fileName
的映射,这可能会很乏味,而且大多数自动化的尝试都很容易出错

另一方面,如果您有一个克隆,其工作树具有所需的大小写,则可以从该工作树重建索引。(以这种方式删除索引似乎有风险;但即使出了问题,也可以使用
重置
轻松重建索引,或者在绝对最坏的情况下,从源代码处恢复—这是分布式源代码管理的一部分。)

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

这里的诀窍很简单:在不区分大小写的配置中,git将理解工作树文件
MyFile
与索引项
MyFile
相同,因此只需执行一个add就不会更改索引中的名称。但是如果索引没有匹配的条目,那么文件名大小写将匹配工作树中当前的内容


(似乎你是说这不是你期望的行为;我只是重新测试了,至少从2.25.0.windows.1开始,这就是我看到的行为。我不记得有任何版本表现不同。)

这是否回答了你的问题?是的,部分,但批量解决方案就可以了。正如我所看到的,这不是一个简单的自动化。对不起,没有通用的方法。你必须自己写一些东西。谢谢,如果丢失重命名文件的历史记录不是问题的话,它可以很好地工作。使用ignorecas true/false试用,git版本2.14.1.win。最后用git mv处理了几十个重命名的文件。@gramgram-不知道你说的丢失历史是什么意思。我概述的方法不会以任何方式改变历史。编辑了你的最后一句话。决定文件名是否不区分大小写的是文件系统,而不是操作系统。
$ 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
...
git rm --cached -r -- :/:
git add -- :/: