正确定义问题
吉特是
总是
能够
储存
在提交和Git索引中,即两个不同名称情况下的两个文件(例如,两者
README
和
readme
)在同一个目录中,因为Git根本不在操作系统目录中存储文件。文件在提交中被冻结,
1.
2.
出现问题的原因是,作为人类操作Git的用户,您希望使用操作系统提供的文件系统,在该系统中,您的计算机以正常的日常形式存储文件,以便计算机的其他部分也可以使用它们。这不是一个不合理的要求——Git的内部文件存储在只有Git才能使用的内部格式中。您需要能够使用Git来
完成某事
,而不仅仅是整天玩Git。
MacOS能够提供区分大小写的文件系统(可以同时容纳
和
自述
某人
不是你干过这种事:
然后我发现origin两者都有
SeatSubstate.vue
&
seatSubstate.vue
在路上
src/view/callCenter/seatReport
换句话说,你有
两个文件
在一些现有的
. 正如我们刚才所说,Git完全能够处理这个问题。不是你的操作系统。
所以如果你跑
git checkout
和
选择
两个文件
两种拼写
,
SeatSubstate.vue
和
seatSubstate.vue
两个文件
(使用两种拼写!)到您的工作树,但您的操作系统只能容纳
拼写,所以一个文件删除了另一个文件,剩下的只有
一
存档
当Git将索引文件及其内容与工作树文件及其内容进行比较时,Git将:
-
看,根据索引,有两个文件;
-
尝试将每个索引文件与Git打开该名称时获取的工作树文件进行比较;
-
抱怨其中一个被修改了。
自述
和
自述
,具有不同的内容,然后将其克隆到Mac:
sh-3.2$ git clone ssh://[path]/caseissue
...
Receiving objects: 100% (4/4), done.
sh-3.2$ cd caseissue
sh-3.2$ ls
readme
sh-3.2$ git ls-files --stage
100644 a931371bf02ce4048b623c56beadb9a926138516 0 README
100644 418440c534135db897251cc3ceca362fe83c2117 0 readme
果然,它有两个文件,只是大小写不同。让我们看看发生了什么
sh-3.2$ git show :0:README
I AM AN UPPERCASE FILE
sh-3.2$ git show :0:readme
i am a lowercase file
sh-3.2$ cat readme
i am a lowercase file
我们的地位和地位:
sh-3.2$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README
no changes added to commit (use "git add" and/or "git commit -a")
取决于我们需要做什么,我们可能只需要
索引,否则我们可能需要工作
指数,这是更痛苦的。
1.
从技术上讲,冻结文件的内容存储在
水滴对象
,它们的名称存储在
树对象
,并且提交是
提交对象
指的是树对象,树对象指的是blob对象。但是从用户的角度来看,文件被冻结在提交中,所以我们可以在这里使用这个短语。
2.
索引实际上可以是多个不同的数据文件,您可以将Git指向其他索引文件,并使用它执行各种花哨的操作。就是这样
git stash
下一步你将作出承诺
为了我们的目的,这只是文件
.git/index
如果您需要,该怎么办
任何一个
文件如果你需要与
二者都
SeatSubstate.vue
,显然,您需要设置区分大小写的文件系统。但不管你在做什么,我们可以假设你不需要
任何一个
这里使用的技巧是从
工作树中剩下的一个文件,然后忽略Git告诉您
sh-3.2$ rm readme
sh-3.2$ git status
On branch master
Your branch is up to date with 'origin/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
deleted: readme
no changes added to commit (use "git add" and/or "git commit -a")
现在,简单地说
不要
git commit -a
git add
只有那些你需要的文件
被改进的
,两个都不碰
删除
以任何方式归档。
你现在可以
git commit
sh-3.2$ echo 'this file is independent of the READMEs' > newfile
sh-3.2$ git add newfile
sh-3.2$ git commit -m 'add new file'
[master 6d5d8fc] add new file
1 file changed, 1 insertion(+)
create mode 100644 newfile
sh-3.2$ git push origin master
Counting objects: 3, done.
...
2dee30f..6d5d8fc master -> master
在另一台(区分大小写的文件系统)计算机上,更新到此提交后:
$ ls
newfile readme README
$ for i in *; do echo -n ${i}: && cat $i; done
newfile:this file is independent of the READMEs
readme:i am a lowercase file
README:I AM AN UPPERCASE FILE
你需要其中一个文件吗
不需要改变它
二者都
存档
两种拼写
在Mac或Windows系统上不区分大小写的工作树中。
可以
选择我们得到的文件!假设我们需要
文件我们可以看到,我们得到的是
自述
sh-3.2$ git checkout -- README
sh-3.2$ ls
README newfile
sh-3.2$ cat README
I AM AN UPPERCASE FILE
如果我们需要,请使用小写字母:
sh-3.2$ rm README
sh-3.2$ git checkout -- readme
sh-3.2$ ls
newfile readme
sh-3.2$ cat readme
i am a lowercase file
也就是说,我们删除了
错误的
一个,然后使用
从索引中获取一个文件
活动
git checkout --
path
为了得到一个文件和一个案例,我们
希望我们现在可以使用此文件。但我们不能添加或更改它。
如果你需要怎么办
文件,还是需要处理其中一个?
不能
一次一个
,做一些改变,这是我们需要做的
可以
目录
很容易:
sh-3.2$ git show :README
I AM AN UPPERCASE FILE
sh-3.2$ git show :readme
i am a lowercase file
:0:README
和
:README
对我来说是完全一样的
git show
:从路径名下的索引槽0获取文件
自述
. 您可以从中重定向输出
吉特秀
您可以选择任意文件名,这样您就可以将这两个内容放入两个文件中,并使用您的操作系统认为“不同”的名称。你可以用
:自述
或
作为论据
吉特秀
. 我不总是一致的关于我是否使用索引号
:
-前缀形式在这里。原因是什么
是
:0:
形式上,索引中还有stage1、stage2和stage3插槽,仅在合并期间使用。也就是说,如果有
:1:README
如上所述,您还可以删除工作树文件并使用
git checkout -- <path>
得到
一
它们中的一个,与您选择的案例一起,放入具有相同案例的工作树中。不幸的是,如果你想
文件,这并不总是有效:
sh-3.2$ rm readme
sh-3.2$ git checkout -- README
sh-3.2$ echo UPPERCASE IS LIKE SHOUTING >> README
sh-3.2$ git add README
sh-3.2$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README
哎呀!似乎Git已经决定
自述
工作树中的文件应更新stage zero
自述
文件在索引中!果然,Git就是这么做的:
sh-3.2$ git show :0:README
I AM AN UPPERCASE FILE
sh-3.2$ git show :0:readme
I AM AN UPPERCASE FILE
UPPERCASE IS LIKE SHOUTING
因此,现在我们必须求助于一种工具,它允许我们直接写入索引。首先,让我们删除此更改并返回到“干净”状态,其中没有工作树副本。
注意:如果您的实际工作比我的更复杂,您可能希望在之前将其保存到其他地方
git reset
把它擦掉!
sh-3.2$ git reset --hard
HEAD is now at 6d5d8fc add new file
sh-3.2$ rm readme
sh-3.2$ git status --short
D README
D readme
这个
--short
这里的输出,它具有
D
HEAD
复制所以现在我们可以得到我们想要的文件,无论哪个,isI都会再次选择大写,因为上次它出错了:
sh-3.2$ git checkout -- README
sh-3.2$ cat README
I AM AN UPPERCASE FILE
现在,我们使用普通的计算机工具来处理该文件:
sh-3.2$ echo UPPERCASE IS LIKE SHOUTING >> README
把它加回去
但是,我们必须使用
git hash-object -w
git update-index
sh-3.2$ blob=$(git hash-object -w README)
sh-3.2$ echo $blob
fd109721431e207046a4daefc9712f1424d7f38f
(修订)
echo
这里只是为了举例说明,说明我们得到了一个散列ID)。现在我们需要制作一个格式正确的索引项,一个la
git ls-files --stage --full-name
. 也就是说,我们需要
全路径
到文件,相对于树的顶部。自从我
和
自述
文件是
在里面
树的顶端,在我这里,这只是意味着
或
自述
. 例如,您的两个文件所在的位置
src/视图/呼叫中心/海港
,则需要将其包含在路径名中。
在任何情况下,将blob对象写入Git数据库后,我们现在需要更新索引项:
sh-3.2$ printf '100644 %s 0\tREADME\n' $blob | git update-index --index-info
sh-3.2$ git status --short
M README
M readme
这表明我们有一个阶段性的变更要提交到
自述
自述
. 这是较长的
git status
sh-3.2$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme
更直接地说,我们可以使用
要查看索引中的内容,请执行以下操作:
sh-3.2$ git show :README
I AM AN UPPERCASE FILE
UPPERCASE IS LIKE SHOUTING
sh-3.2$ git show :readme
i am a lowercase file
这就是我们想要的!所以现在我们可以
git提交
结果是:
sh-3.2$ git commit -m 'annotate README'
[master ff51464] annotate README
1 file changed, 1 insertion(+)
sh-3.2$ git push origin master
Counting objects: 3, done.
...
6d5d8fc..ff51464 master -> master
$ for i in *; do echo -n ${i}: && cat $i; done
newfile:this file is independent of the READMEs
readme:i am a lowercase file
README:I AM AN UPPERCASE FILE
UPPERCASE IS LIKE SHOUTING
你可以随时使用
git散列对象-w
git update-index --index-info
如果您的操作系统无法按照Git索引的拼写方式拼写文件或路径名,您仍然可以使用文件的名称
目录
可以
使用这样做之后,您可以使用
git散列对象-w
git更新索引--索引信息
要将blob散列写入indexat,请选择所需的暂存槽,通常是Git需要的路径名下的零。
明智地使用
git添加
重新映射
知识产权
知识产权
这不仅适用于大小写折叠问题,也适用于Unicode问题:MacOS将文件名存储在
一
表单,规范了它们,而Linux允许在
每个
agréable
在Linux上可以有两个名称,但在MacOS上只能有一个。