使用重复文件在Windows上进行Git合并

使用重复文件在Windows上进行Git合并,git,Git,我在同步本地分支和远程分支时遇到问题,我知道原因并有解决办法,但想知道是否有更好的解决方案 相关因素: 这是一个共享的分支;因此,分支机构没有积极的发展 我在Windows上工作(并且无法轻松激活Posix对区分大小写的文件名的支持) 存储库包含两个仅在文件名大小写上不同的文件,即它们将相互重写 我想添加一些其他文件 并将此分支与远程同步(使用合并/拉取) 第2项和第3项意味着只要签出文件就会产生更改,因为一个案例变量会覆盖另一个案例变量 但是,项目1-4仍然可以通过创建新的本地分支、暂存和提交

我在同步本地分支和远程分支时遇到问题,我知道原因并有解决办法,但想知道是否有更好的解决方案

相关因素:
  • 这是一个共享的分支;因此,分支机构没有积极的发展
  • 我在Windows上工作(并且无法轻松激活Posix对区分大小写的文件名的支持)
  • 存储库包含两个仅在文件名大小写上不同的文件,即它们将相互重写
  • 我想添加一些其他文件
  • 并将此分支与远程同步(使用合并/拉取)
  • 第2项和第3项意味着只要签出文件就会产生更改,因为一个案例变量会覆盖另一个案例变量

    但是,项目1-4仍然可以通过创建新的本地分支、暂存和提交新文件以及忽略警告来处理

    但合并/拉等失败;因为案例冲突的文件会导致问题

    解决办法: 删除本地分支,然后基于远程创建一个新分支(假设没有本地更改)。

    您不需要删除任何分支,但必须小心使用工作树

    请记住,Git实际使用的是Git的索引,既可以签出任何现有的提交,也可以进行任何新的提交。Git还将该实体称为暂存区,反映了它在进行新提交中的作用,尽管现在您主要将其视为一个标志,
    --cached
    --缓存,反映了索引在Git快速运行中的作用

    存储在索引中的文件区分大小写,因此Git的索引能够保存两个单独的文件,例如名为
    a/readme.txt
    a/readme.txt
    。请注意,索引中的文件用使用正斜杠的路径名表示,而
    a/readme.txt
    是一个文件名。索引中没有文件夹,只有名称中带有嵌入斜杠的文件

    索引中的文件以Git的内部形式存储。这对您没有用处:这些文件是压缩的、只读的、Git-only数据格式。所以Git将每个这样的文件扩展为一个普通的日常读/写文件。这个普通的读/写文件进入一个文件夹,并有一个普通的日常文件名。但这意味着,当Git同时编写
    a/readme.txt
    (需要在其中创建名为
    a
    的文件夹和名为
    readme.txt
    的文件)和
    a/readme.txt
    (需要创建名为
    a
    的文件夹和名为
    readme.txt
    的文件)时,就会出现名称冲突。实际上只创建了一个文件夹和一个文件

    索引继续保存两个文件,
    a/readme.txt
    a/readme.txt
    。使用Git的一个所谓的管道命令,
    Git update index
    ,可以(但非常困难和烦人)更新这两个文件。请记住,虽然索引保存Git冻结和压缩格式的文件,但您可以批量替换这些索引文件,前提是:

  • 将数据压缩成Git的内部格式,生成Git所称的blob哈希ID
  • 提供
    git update index
    文件名,如
    a/readme.txt
    ,以及blob散列ID
  • 要进入内部blob对象的数据可以来自计算机上任何位置的任何文件。它甚至不需要在你的工作树上:它可以在那里或其他地方。使用
    git hash object-w
    创建内部blob对象,并将结果hash ID保存在变量中。然后,立即运行
    git update index
    ,以替换文件的索引副本

    有关如何使用这两个低级卫浴命令中的每一个命令,请参见它们的文档:和

    请注意,这两个命令并不是真正供人使用的:它们是由更人性化的程序运行的,它们只是像
    git add
    git rm
    这样的命令可以使用的构建块。在这里使用
    git add
    git rm
    的问题是,这些程序希望使用您计算机上的名称,如
    A\README.TXT
    ,而不是git的内部文件名,来处理您的工作树文件。这就是为什么您需要使用低级命令,以便您可以将Git内部文件的数据(
    a/readme.txt
    a/readme.txt
    )存储在具有不同名称的文件中,然后从这些不同名称更新Git的内部文件

    编辑:我忘了提到您需要读取这两个文件。有多种方法可以做到这一点,但最简单的方法可能是使用带有shell样式重定向的
    git show
    。在sh/bash中,您将运行:

    git show HEAD:a/readme.txt > lowercase-readme
    git show HEAD:A/README.TXT > uppercase-readme
    

    使用两个不同的名称将两个文件导出到工作树中。事实上,Git将在Git签出期间提取这两个文件,但它们最终将占用一个工作树文件,其名称可能是
    readme.txt
    readme.txt
    ,这取决于哪个名称“赢得”get-a-Windows-file-name竞赛;此文件可能会出现在名为
    a
    的文件夹中,或者出现在名为
    a
    的文件夹中,这取决于哪些文件夹“赢得”了get-a-windows-folder-name竞赛。

    为什么不干脆重命名这些文件?如果重命名这些文件,可能会有对这些文件的引用中断;还有其他人对他们负责。因此,我想让它们保持原样。使用虚拟机或在Linux上工作这样的工作将是一场噩梦。顺便说一句,文件名只有大小写不同是很奇怪的:我在同一个repo中处理其他文件,所以我并没有真正处理那些文件(只有大小写不同的文件)-只是它们会把我的工作搞得一团糟,即使我不碰它们。我有一个文件login/login.tsx和login/login.tsx。两者都可以在Githu上看到