我的儿子在SuperAdventure C# Tutorial工作,我让他承诺到当地的Git回购,并推到Github repo。在某个地方,他最终在他的仓库中出现了一些奇怪的错误,这些错误会在每次提交时交替更改特定文件,有时会对以下两个文件名显示相同的更改:
SuperAdventure/SuperAdvetnure.cs
superadventure/superadvetnure.cs
(是的 - 他在* .cs文件上拼错了)。踢球者是只有一个文件(大写的原始版本)。 Git似乎有时会认为更改是在这些文件中的一个或另一个,甚至是这两个文件中,并且在提交Git认为存在的更改之后,它只会看到刚刚提交的更改的反转(即,现已被删除,反之亦然)。
如果我查看Git Extensions中每个提交的历史记录,查看文件树选项卡,我可以看到从提交698f378a(第16.1课 - 重构)开始,文件树显示添加了未大写的{{1除了大写的原始文件之外,此文件夹和文件存在于每个将来的提交中。 superadventure/superadvetnure.cs
文件夹中没有任何其他文件 - superadventure
文件夹中的其他文件都没有重复,只有一个文件。
由于Windows并不关心大小写 - 但是Unix确实如此,Git和Windows或Git和Visual Studio之间是否存在一些奇怪的交互?我不知道他是如何设法在Git仓库中获得不同的资本化。问题似乎是当Git试图将这两个文件放入工作目录时,它们只是互相覆盖。
我尝试了一些挑选和重新定位并得到上面描述的奇怪错误 - 但那是在我发现添加ghost文件重复的原始提交之前 - 可能从此之前的提交开始,rebasing将起作用?
有没有办法直接删除重复的文件?我想这可能搞砸了一些后续提交?
解决此问题并删除重复的SuperAdventure
文件夹和文件的最佳方法是什么?
奖金问题:首先如何发生这种情况?
答案 0 :(得分:2)
是的,您可以删除它。最好在github界面中这样做,不要没有git识别删除错误文件的风险。之后再次克隆是有意义的。
奖励回答:除非你提供VS,git,你正在使用的界面等版本并尝试重现它,否则很难说。
只是一些观点:
我建议安装VS 2017和最新的git版本(或者它是否与VS捆绑?)并观察它是否再次发生。
答案 1 :(得分:0)
从max630's answer开始,我能够在本地成功修复此回购问题(并非如他所建议的那样直接在Github上)。我不想在Github中修复它,因为我担心在Github的提交中直接删除有问题的ghost文件会产生副作用。
当我完成整个过程时,我发现我的担心可能是合理的 - 在重新定位期间从某些提交中删除ghost文件后,最终至少有一个没有更改的后续提交。如果我在Github中删除了文件,我不确定会怎么做。
以下是适合我的流程:
使用Git Extensions Git GUI查看每个提交的“文件树”。在历史记录中向后移动,直到找到最早没有问题的提交。
在最后一次良好的提交中创建一个名为fixedmaster
等名称的新分支。
重新显示从主分支到新的fixedmaster分支的提交,确保ghost文件不是每个提交的一部分。
git cherry-pick <commit>
签出fixedmaster
签出(实际上我使用了Cherry Pick的Git Extensions GUI选项)。git status
并查看是否包含ghost文件。如果是其中一个更改,或者显示为已添加或已删除的文件,我可以使用git reset HEAD <filename>
(在我的情况下,文件名为superadventure/superadvetnure.cs
)清除索引,并且实际上导致它完全消失(有道理:幽灵并不存在......) git commit --amend
来改变现有提交,或者制作一个全新的提交。对fixedmaster
完成此过程后,您需要对其他任何分支执行相同操作。
您可以将master
切换为fixedmaster
,但请先考虑以下几点:
您可以将master
重置为新的fixedmaster
oldmaster
或类似的标记。fixedmaster
提交fixedmaster
master
应位于固定分支的位置,旧的主分支存在,并在末尾标记。如果你想在将来摆脱它,只需删除标签。如果需要,重复其他分支
强制将主控(和任何其他固定分支)推送到远程仓库。当然,如果你有很多用户不知道会发生这种情况,这会导致havok,如上所述。
还有其他方法可以获得更精细的细节,但是你可以了解它。