我正在尝试将文件从 foobar.php 重命名为 FooBar.php,这在 Git 中是一个相当大的挑战。到目前为止,我发现我必须将 git config 值设置ignorecase
为false
(为什么它在 Mac OS X 上设置为 true,无论如何?)。我已经成功地在我的本地存储库中重命名了这些文件,但是在我将它推送到 BitBucket 之后,我已经得到了FooBar.php
和foobar.php
那里一样。我如何摆脱这些重复?谢谢。
6 回答
不区分大小写,保留大小写
您可能遇到的问题是 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
在上面,文件现在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
应用于目录
当我在目录级别(而不是在文件级别)上努力解决这个问题时,这里是应用于文件夹的配方(这是在 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"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
- 再也不会遇到这个问题了。
克隆/签出到区分大小写的文件系统(在 Mac OS X 上,您只需制作区分大小写的磁盘映像即可),然后git rm
是您不想要的大写文件。
至于为什么ignorecase
设置为 true,文档说:
core.ignorecase
默认值为 false,除非git-clone(1)
或git-init(1)
将在创建存储库时探测并设置为core.ignorecase
true(如果合适)。
由于您的 Mac 可能具有不区分大小写的文件系统(这是默认文件系统),因此您git
会注意到这一点并适当地设置标志。
一个简单快速的解决方法是来回重命名受影响的根文件夹:
例子:
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
这应该解决所有文件案例问题(如果在您的本地副本中修复)
在 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