git origin中不同大小写的重复文件(bitbucket)

pet*_*iar 34 git

我正在尝试将文件从foobar.php重命名为FooBar.php,这在Git中是一个相当大的挑战.到目前为止,我发现我不得不设立的混帐配置值ignorecase,以false(为什么它被设置为true,在Mac OS X,反正?).我已经设法在我的本地存储库中成功地重命名了这些文件,但在我将它推送到BitBucket之后我就得到了FooBar.php那么好foobar.php.我如何摆脱这些重复?谢谢.

AD7*_*six 33

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

您可能遇到的问题是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
Run Code Online (Sandbox Code Playgroud)

在上面,文件现在README根据git 命名该文件readme存在且未经修改.

使用两个提交

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

$ mv file.php /tmp
$ git rm file.php
$ git commit -m "deleting file"
$ git push
Run Code Online (Sandbox Code Playgroud)

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

$ mv /tmp/file.php File.php
$ git add File.php
$ git commit -m "adding File"
$ git push   
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我已经一步完成了,比如`git mv foobar.php foobar.php.bak``git mv foobar.php.bak FooBar.php``git commit -m"重命名文件."`它看起来应该有效. (2认同)

Tho*_*asH 15

适用于目录

由于我在目录级别(而不是文件级别)上遇到此问题,这里是应用于文件夹的配方(这是在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 - 永远不要再遇到这个问题.


Car*_*rum 5

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

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

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

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

  • 对不起,我的印象(这些年来......)因为 Mac OS X 应该是 *nix-like 系统,所以它区分大小写。显然,说实话,这对我来说有点震惊。感谢所有回复,我会努力应对这种新情况,这样 1 Infinite Loop 上的任何人都不会受到伤害。 (4认同)
  • HFS+ 默认情况下保留大小写但不区分大小写。 (2认同)