Git

TFS:git web 原始碼瀏覽器中的不一致

  • February 2, 2019

我們一直在使用本地 Team Foundation Server v. 15.117.27414.0.

一切正常,除了在項目的門戶網站上,在程式碼頁面(程式碼瀏覽器)上,git repo 中的所有文件都沒有出現。例如,我們有一個帶有 Models 文件夾的 MVC 項目,有 11 個類,但其中只有 7 個出現在網頁中。項目的顯示方式還有其他問題。例如,有兩個同名的項目文件夾(一個字元大小寫不匹配),內容相似,而實際上應該有一個。

側邊欄顯示了兩個同名的文件夾——但不是所有的文件!

所有這一切都令人困惑。否則,一切正常。我們可以複製項目或將其下載為 zip,所有文件都在那裡。它只是混淆了它在 TFS 門戶中程式碼選項卡下的顯示方式。

Git 是一個區分大小寫的版本控制系統。因此,它允許您送出僅大小寫不同的文件和文件夾。這是完全合法的,Azure DevOps 和 Team Foundation Server(實際上,每個 Git 託管服務提供商)都必須允許和支持。

您可以通過git ls-tree HEAD在儲存庫中執行來查看這一點。它將顯示兩種情況下的文件。

發生了兩件事之一:

  • 有人在區分大小寫的文件系統(如 Linux)上複製了您的儲存庫,並創建了一個僅大小寫不同的目錄,向其中添加文件並送出它們。這是不太可能的。
  • 更有可能是有人他們的儲存庫複製到不區分大小寫的文件系統(如 Windows)上並禁用了core.ignorecase. core.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

要解決此問題,請確定要保留的名稱(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

您可以簽入以解決問題。

如果您有兩個名稱相同但大小寫不同的文件,則需要決定保留哪個名稱。

% git ls-files --stage
100644 ba578e48b183662ddf9b38682cc52fb80066ce6d 0   FOO/bar
100644 5716ca5987cbf97d6bb54920bea6adde242d87e6 0   foo/bar

要刪除其他文件,請使用該--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

引用自:https://serverfault.com/questions/951972