我试图将文件从foobar.php重命名为FooBar.php,在Git中这是一个相当大的挑战。到目前为止,我已经发现我必须设置git配置值ignorecase
为false
(不管怎样,为什么在Mac OS X上默认为true?)。我已成功地在本地仓库中重命名了这些文件,但在将其推送到BitBucket后,我在那里得到了FooBar.php
以及foobar.php
。如何摆脱这些重复文件?谢谢。
我试图将文件从foobar.php重命名为FooBar.php,在Git中这是一个相当大的挑战。到目前为止,我已经发现我必须设置git配置值ignorecase
为false
(不管怎样,为什么在Mac OS X上默认为true?)。我已成功地在本地仓库中重命名了这些文件,但在将其推送到BitBucket后,我在那里得到了FooBar.php
以及foobar.php
。如何摆脱这些重复文件?谢谢。
你可能遇到的问题是,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):
git mv Foobar Foobar.tmp
- 您会得到一组重命名的文件,还有一组从其他路径中删除的文件及其相应的未跟踪文件。git add .
- 将所有删除/未跟踪的文件添加到暂存区。
git commit -m "将 Foo[Bb]ar 同步到临时文件夹中"
- 提交临时文件夹。git mv Foobar.tmp FooBar
- 现在将文件夹从临时名称更改为所需的名称。git commit -m "将 FooBar 移动到指定位置"
- 提交目标名称。git push
- 现在 Bitbucket 应该显示一个名为 FooBar 的子文件夹。git config [--global] core.ignorecase false
- 不要再遇到这个问题了。mv
命令通常会导致您本地 Git 认为是“未跟踪”的第二个目录中的一些文件,而未跟踪的文件需要显式添加,以便在以下提交中包含它们。 - ThomasH将代码克隆/检出到区分大小写的文件系统(在 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
提交文件 "FooBar.php"(请确保只提交您不需要的文件 - 在这里我正在删除大写字母文件名文件)
推送更改并还原丢失的文件。
恢复为不区分大小写
git config core.ignorecase false
git mv foobar.php foobar.php.bak
git mv foobar.php.bak FooBar.php
git commit -m "重命名文件。"
看起来应该可以工作。 - petiar