代码之家  ›  专栏  ›  技术社区  ›  Qiulang

即使在git commit之后也没有为提交而进行更改-am b/c origin有一个文件名为反大写的文件

  •  -1
  • Qiulang  · 技术社区  · 7 年前

    git commit -am "why"
    On branch tmp
    Changes not staged for commit:
        modified:   src/view/callCenter/seatReport/SeatSubstate.vue
    

    然后我发现origin两者都有 SeatSubstate.vue seatSubstate.vue 在路上 src/view/callCenter/seatReport

    但是在我的mac电脑上

    ls src/view/callCenter/seatReport/
    ...     seatSubstate.vue /* did NOT show SeatSubstate.vue only seatSubstate.vue */
    

    How do I commit case-sensitive only filename changes in Git?

    但是我仍然不明白为什么git不能提交这个文件。

    第二,我如何解决这个问题?例如,在那次讨论中,许多人提到了 git mv 重命名 你能不能解决我的问题。

    -----更新-----

    我突然意识到我的mac电脑(我的高清电脑)不区分大小写(APFS),请参阅 https://apple.stackexchange.com/questions/71357/how-to-check-if-my-hd-is-case-sensitive-or-not .

    enter image description here

    重命名 似乎可以解决问题,但我不是100%确定。

    Changing capitalization of filenames in Git

    1 回复  |  直到 7 年前
        1
  •  2
  •   torek    7 年前

    正确定义问题

    吉特是 总是 能够 储存 在提交和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上只能有一个。