git源中大小写不同的重复文件(bitbucket)
我正在尝试将文件从foobar.php重命名为foobar.php,这在Git中是一个相当大的挑战。到目前为止,我发现我必须将git config值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
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同步到临时文件夹”
-现在从temp重命名。指向所需的名称git mv Foobar.tmp Foobar
-提交目标名称git commit-m“将FooBar移动到位”
-现在Bitbucket应该显示一个子目录FooBargit push
-永远不要再碰到这个问题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删除了大小写错误的文件,然后提交
然后只需将文件移回:
现在一切如期进行
谢谢你的回复。我的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