TFS:git web 源代码浏览器中的不一致

Dav*_*vid 1 git team-foundation-server path

我们一直在使用内部部署的 Team Foundation Server v. 15.117.27414.0.

一切正常,除了在项目的门户网站上,在代码页(代码浏览器)上,git 存储库中的所有文件都没有出现。例如,我们有一个 MVC 项目,里面有一个 Models 文件夹,有 11 个类,但是只有 7 个出现在网页中。项目的显示方式还有其他问题。例如,有两个同名的项目文件夹(一个字符大小写不匹配),内容相似,实际上应该有一个。

侧边栏显示两个同名文件夹 - 但不是所有文件!

所有这些都令人困惑。否则,一切正常。我们可以克隆项目或将其下载为 zip 文件,所有文件都在那里。它只是混淆了它在 TFS 门户中的“代码”选项卡下的显示方式。

Edw*_*son 6

Git 是一个区分大小写的版本控制系统。因此,它允许您提交仅在大小写不同的文件和文件夹。这是完全合法的,也是 Azure DevOps 和 Team Foundation Server(实际上,每个 Git 托管提供商)必须允许和支持的。

您可以通过git ls-tree HEAD在您的存储库中运行来查看这一点。它将显示两种情况下的文件。

发生了两件事之一:

  • 有人在区分大小写的文件系统(如 Linux)上克隆了您的存储库,并创建了一个仅区分大小写的目录,向其中添加文件并提交它们。这是不太可能的
  • 许多可能的是,有人已经克隆了他们的仓库到区分大小写的文件系统(如Windows)和残疾人core.ignorecasecore.ignorecase指示 Git 你在一个不区分大小写的文件系统上,如果你在存储库中已经git add FOO/file.txt有一个命名的目录时运行foo,你实际上想要使用现有目录。

core.ignorecase不是应该更改的设置。这不是一个选择。它是一个缓存值。Git 会在创建存储库时发现您的文件系统功能(区分大小写、Unicode 功能)并缓存它们,这样它就不必在每个命令上重新发现此信息。

不应更改此值,否则您可能会遇到此类问题。

要解决此问题,您可以将一个案例重命名为另一个案例。例如,如果您有一个存储库,其中包含一个名为 的文件夹foo和另一个名为FOO. 假设您有两个文件,foo/bar并且FOO/baz

% git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0   FOO/baz
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0   foo/bar
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请决定要保留哪个名称(fooFOO)并重命名另一个。您需要git mv-f标志一起使用:

% git mv -f FOO/baz foo/baz
% git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    FOO/baz -> foo/baz
Run Code Online (Sandbox Code Playgroud)

您可以检查它以解决问题。

如果您有两个名称相同但大小写不同的文件,则需要决定保留哪个名称。

% git ls-files --stage
100644 ba578e48b183662ddf9b38682cc52fb80066ce6d 0   FOO/bar
100644 5716ca5987cbf97d6bb54920bea6adde242d87e6 0   foo/bar
Run Code Online (Sandbox Code Playgroud)

要删除其他文件,请使用--cached标志git rm来防止将其从磁盘中删除。

% git rm --cached FOO/bar
% git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    FOO/bar

Run Code Online (Sandbox Code Playgroud)

  • 我已经更新了它,包括修复它的说明;我不建议恢复,因为您可能想要内容 _and_ 可能有多个后续提交影响该路径。 (2认同)