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

git源中大小写不同的重复文件(bitbucket),git,Git,我正在尝试将文件从foobar.php重命名为foobar.php,这在Git中是一个相当大的挑战。到目前为止,我发现我必须将git config值ignorecase设置为false(为什么在Mac OS X上设置为true?)。我成功地在本地存储库中重命名了这些文件,但在我将其推到BitBucket后,我在那里得到了FooBar.php以及FooBar.php。我该如何处理这些复制品?谢谢。克隆/签出到区分大小写的文件系统中(在Mac OS X上,您只需制作区分大小写的磁盘映像即可),然后g

我正在尝试将文件从foobar.php重命名为foobar.php,这在Git中是一个相当大的挑战。到目前为止,我发现我必须将git config值
ignorecase
设置为
false
(为什么在Mac OS X上设置为true?)。我成功地在本地存储库中重命名了这些文件,但在我将其推到BitBucket后,我在那里得到了
FooBar.php
以及
FooBar.php
。我该如何处理这些复制品?谢谢。

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

至于为什么
ignorecase
设置为true,报告说:

core.ignorecase

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

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

不区分大小写,保留大小写 您可能遇到的问题是mac上的默认文件系统不区分大小写,但保留大小写;在这种情况下,
file.php
file.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
确保不需要的文件已从存储库中删除。然后,将文件移回正确位置并添加它

$ mv /tmp/file.php File.php
$ git add File.php
$ git commit -m "adding File"
$ git push   
应用于目录 当我在目录级别(而不是文件级别)上解决这个问题时,下面是应用于文件夹的方法(这是在Windows上的git v2.9.2)

  • Bitbucket将显示两个子文件夹,比如Foobar和Foobar,它们下面有不同的文件/文件夹
  • 客户端上core.ignorecase被设置为true,并且两个文件树合并到一个公共根下,例如Foobar。
    • 暂时不要将core.ignorecase设置为false,因为它会突然从另一个路径留下“未跟踪”的文件
  • git mv Foobar Foobar.tmp
    -您将从另一个路径获得一组重命名的文件,还将获得一组已删除的文件及其相应的未跟踪文件
  • git add.
    -暂存所有已删除/未跟踪的文件。
    • 这对我来说还行。尽管这些文件显示为删除/添加,但这些文件的历史记录不会丢失(神奇地)
  • git commit-m“将Foo[Bb]ar同步到临时文件夹”
    -提交临时文件夹。文件夹
  • git mv Foobar.tmp Foobar
    -现在从temp重命名。指向所需的名称
  • git commit-m“将FooBar移动到位”
    -提交目标名称
  • git push
    -现在Bitbucket应该显示一个子目录FooBar
  • git config[--global]core.ignorecase false
    -永远不要再碰到这个问题

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

例如:

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

这将解决所有文件案例问题(如果在本地副本中已修复)

我在Sourcetree中的Windows上进行了以下更改:

我通过设置所需的大小写解决了这个问题,在本例中是
constants.ts

移动了文件,因此git删除了大小写错误的文件,然后提交

然后只需将文件移回:

现在一切如期进行

  • 在git中启用区分大小写

    git config core.ignorecase true

  • Git删除该文件(Git现在会说foobar.php丢失,foobar.php被删除)

    git rm FooBar.php

  • Git提交文件“FooBar.php”(请确保只提交您不需要的文件-我正在删除caps文件名文件)

  • 推送更改并还原丢失的文件

  • 恢复为不区分大小写

    git config core.ignorecase false


  • 谢谢你的回复。我的Mac OS X区分大小写,但当我将origin/master拉到本地master分支时,我只看到大小写正确的文件,没有重复的文件。然而,在BitBucket上存在一些问题。或者你是说别的什么?对不起,我是git新手。你确定你有区分大小写的文件系统吗?这会有点奇怪。对不起,我(这么多年来)一直认为MacOSX应该是*nix一样的系统,它是区分大小写的。显然,说实话,事实并非如此,这让我有点震惊。感谢所有的回复,我将尝试处理这种新情况,这样在1无限循环中没有人会受到伤害。HFS+默认情况下保留大小写,但不区分大小写。是的,现在我意识到这是文件系统的问题,而不是操作系统的问题。有道理,谢谢!我已经在一个步骤中完成了,比如
    git mv foobar.php foobar.php.bak
    git mv foobar.php.bak foobar.php
    git commit-m“重命名文件”。
    它看起来应该可以工作。这很奇怪。它对一个目录中的文件起作用(我得到了正确的大小写,BitBucket上的重复项消失了)。但是,它对另一个目录中的文件不起作用(我得到了git状态下的已删除文件,我提交了它们并将其推送到了源目录,但BitBucket上仍然存在这些重复文件)。我现在就试试你的方法。好的,我已经完全按照你的方法做了,我仍然在BitBucket上有那些重复的内容(FooBar.php和FooBar.php都有相同的提交消息“Adding file.”)。还有什么其他的想法可以让你管理这么复杂的文件重命名过程吗?你说的“什么回购协议”是什么意思?这是我的私人回购协议。现在我决定把整个
    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