53

我正在尝试将文件从 foobar.php 重命名为 FooBar.php,这在 Git 中是一个相当大的挑战。到目前为止,我发现我必须将 git config 值设置ignorecasefalse(为什么它在 Mac OS X 上设置为 true,无论如何?)。我已经成功地在我的本地存储库中重命名了这些文件,但是在我将它推送到 BitBucket 之后,我已经得到了FooBar.phpfoobar.php那里一样。我如何摆脱这些重复?谢谢。

4

6 回答 6

55

不区分大小写,保留大小写

您可能遇到的问题是 Mac 上的默认文件系统不区分大小写但会保留大小写;在这种情况下,不可能同时存在file.phpFile.php存在——它们被认为是同一个文件。

这很容易证明:

$ cd /tmp
$ mkdir example
$ cd example/
$ git init
Initialized empty Git repository in /private/tmp/so/.git/ 
$ touch readme
$ git add readme 
$ git commit -m "adding readme"
[master (root-commit) 05fdf7d] adding readme
 0 files changed
 create mode 100644 readme
$ mv readme x
$ git status 
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#  deleted:    readme
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       x
no changes added to commit (use "git add" and/or "git commit -a")
$ mv x README
$ git status 
# On branch master
nothing to commit (working directory clean)
$ ls -l
total 0
-rw-r--r--  1 andy  wheel  0 Aug  1 19:38 README

在上面,文件现在README根据 git 命名,文件readme存在并且未修改。

使用两个提交

因此,不要重命名文件(在不区分大小写的系统上是有问题的),而是分两步进行:

$ mv file.php /tmp
$ git rm file.php
$ git commit -m "deleting file"
$ git push

确保不需要的文件从存储库中消失。然后,将文件移回正确的位置并添加它。

$ mv /tmp/file.php File.php
$ git add File.php
$ git commit -m "adding File"
$ git push   
于 2013-08-01T17:04:58.047 回答
22

应用于目录

当我在目录级别(而不是在文件级别)上努力解决这个问题时,这里是应用于文件夹的配方(这是在 Windows 上,git v2.9.2)。

  • Bitbucket将显示两个子文件夹,比如FoobarFooBar,它们下面有不同的文件/文件夹。
  • 客户端 core.ignorecase设置为true,两个文件树在一个共同的根目录下合并为一个,比如Foobar
    • 暂时不要将core.ignorecase设置为false,因为它会突然让您从另一条路径中获得“未跟踪”的文件!
  • git mv Foobar Foobar.tmp- 您将获得一组重命名的文件,以及一组已删除的文件以及来自其他路径的相应未跟踪文件。
  • git add .- 暂存所有已删除/未跟踪的文件。
    • 这对我来说没问题。尽管这些显示为删除/添加,但这些文件的历史记录并没有丢失(神奇地)。
  • git commit -m"syncing Foo[Bb]ar into temp. folder"- 提交温度。文件夹。
  • git mv Foobar.tmp FooBar- 现在从 temp 重命名。到所需的名称。
  • git commit -m"moving FooBar into place"- 提交目标名称。
  • git push- 现在 Bitbucket 应该显示一个子目录FooBar
  • git config [--global] core.ignorecase false- 再也不会遇到这个问题了。
于 2016-12-02T16:09:50.007 回答
5

克隆/签出到区分大小写的文件系统(在 Mac OS X 上,您只需制作区分大小写的磁盘映像即可),然后git rm是您不想要的大写文件。

至于为什么ignorecase设置为 true,文档说:

core.ignorecase
默认值为 false,除非git-clone(1)git-init(1)将在创建存储库时探测并设置为 core.ignorecasetrue(如果合适)。

由于您的 Mac 可能具有不区分大小写的文件系统(这是默认文件系统),因此您git会注意到这一点并适当地设置标志。

于 2013-08-01T16:59:00.617 回答
1

一个简单快速的解决方法是来回重命名受影响的根文件夹:

例子:

mv src src-tmp
git add .
git commit 'step 1'
git push origin your-branch
mv src-tmp src
git add .
git commit 'step 2'
git push origin your-branch

这应该解决所有文件案例问题(如果在您的本地副本中修复)

于 2021-01-21T21:48:34.833 回答
0

我在 Sourcetree 的 Windows 上得到了以下更改:

在此处输入图像描述

我通过设置我想要的案例来解决它,在这种情况下constants.ts

移动了文件,所以 git 删除了错误大小写的文件,然后提交。

在此处输入图像描述

然后只需将文件移回:

在此处输入图像描述

现在一切都按预期工作。

在此处输入图像描述

于 2021-02-09T15:13:26.640 回答
0
  1. 在 git 中启用区分大小写

    git config core.ignorecase true

  2. Git 删除文件(Git 现在会说 foobar.php 丢失并且 FooBar.php 被删除)

    git rm FooBar.php

  3. Git 提交文件“FooBar.php”(请确保只提交你不需要的文件——这里我删除了 caps 文件名文件)

  4. 推送更改并恢复丢失的文件。

  5. 恢复为不区分大小写

    git config core.ignorecase false

于 2021-04-13T08:48:21.320 回答