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