TFS:git web 原始碼瀏覽器中的不一致
我們一直在使用本地 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
要解決此問題,請確定要保留的名稱(
foo
或FOO
)並重命名另一個。您需要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