2011-12-09 23 views
9

我們在辦公室的Linux服務器上使用遠程Git存儲庫。所有客戶端都是安裝了Git Extensions作爲客戶端(運行msysgit)的Windows PC。如何讓「git分支」尊重Linux上的「core.ignorecase」標誌?

的客戶系統,如果我嘗試做到以下幾點:

git branch Branch1 
git branch branch1 

第二個命令是要失敗的,告訴我,與該名稱的分支已經存在。這是我所期望的,因爲我在git config中將core.ignorecase設置爲true。

但是,如果我直接登錄到Linux系統並運行相同的命令,那麼即使core.ignorecase標誌設置爲true,也會創建兩個分支。

我本來期望第二個命令也會失敗,因爲我配置版本庫來忽略情況,但是這個標誌在Linux系統上什麼都不做,或者我錯過了一些東西。

任何人都可以幫助我理解這個問題,因爲我們計劃將SCM從Source Safe遷移到Git,並且這個問題讓我們感到害怕。如果兩個開發人員創建具有相同名稱但不同情況的分支,並將結果推送到Linux存儲庫,會發生什麼情況?

+0

@meagar是對的;你會想要強制一致的分支名稱框,並且通常避免將除了大小寫之外的東西命名爲相同。但作爲一個說明,Windows註冊表設置HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ kernel \ obcaseinsensitive顯然允許git以其想要的方式工作(我*通過cygwin使用git;不確定msysgit的行爲方式是否相同)。 –

回答

15

我想在@ meagar的答案添加更多的細節:

FAT32/NTFS是case-preserving文件系統。也就是說,如果你命名一個文件「Foo.txt」,它將被存儲爲「」Foo.txt「,如果你保存一個文件爲」foo.txt「,它將被保存爲」foo.txt「。因爲它是不區分大小寫的,所以「Foo.txt」和「foo.txt」實際上是相同的,並且你不能在同一個目錄中同時存在兩個文件。

在您的Windows存儲庫中,如果將名稱從「 Foo.txt「改爲」foo.txt「,如果你不打算將這個變化表明出來,你可以將core.ignorecase配置設置爲true,git不會把它看作是一個改變,如果你設置爲false,它會。 (但由於文件系統和git的性質,它看起來像添加了一個新的文件foo.txt,增加了Windows的混淆)。

這就是core.ignorecase的目的

來到分支。分支只是指向提交的指針。這些指針只是文件。這些文件存儲在.git/refs/heads。當您創建分支時,例如bar,將創建一個名爲.git/refs/head/bar的文件。現在,在Linux中,當您創建一個名爲Bar的分支時,它可以繼續並創建一個文件.git/refs/head/Bar,從而允許創建分支。但在Windows上,您無法創建.git/refs/head/Bar,因此當條形圖存在時,您將無法創建條形分支。意識到core.ignorecase用於處理倉庫中的文件 - 您的代碼庫 - 並且對git的元數據文件沒有影響。

所以你將不得不忍受和適應這樣一個事實,在Linux中,你可以創建具有相同名稱的分支,不同的情況下,但在Windows中,你不能。

+0

非常感謝您的解釋。我還是Git的新手,所以我不知道分支最終變成了簡單的元數據文件。我已經知道Linux和Windows之間區分大小寫的區別,但是我很難理解代碼文件和Linux上的分支之間的區別。現在我明白了。 – franmon

8

如何使「git分支」尊重Linux上的「core.ignorecase」標誌?

你不能,因爲國旗不符合你的想法。

core.ignorecase

如果爲true,此選項允許在不同的解決方法,使GIT中上不區分大小寫,如FAT文件系統更好地工作。

core.ignorecase無關與您所描述的行爲,它是無關的分支名稱的大小寫。 Git無法區分Windows上的Branch1branch1與設置是否設置了core.ignorecase無關,它無論如何都會以相同的方式運行。

......但是這個標誌在Linux系統上什麼都不做,或者我錯過了什麼。

你沒有錯過任何東西。該標誌在Linux系統上什麼都不做。 core.ignorecase不適用於使操作系統不區分大小寫,這是爲了允許Git在不區分大小寫的操作系統上運行破碎的。 Linux從根本上區分大小寫,Git也是如此。你應該試着去處理這個問題,並強制你的開發者使用小寫字母來表示他們的分支名字。你應該而不是試圖讓Git模仿其他操作系統的破壞行爲。

如果兩個開發人員創建具有相同名稱但不同大小的分支並將結果推送到Linux存儲庫,會發生什麼情況?

那麼你將有兩個完全不同的分支,一個小寫,一個這是錯誤命名,有人將被迫合併,拋棄他們錯誤分支。無論如何,這是你會做的事情,作爲使用Git的一個副作用。

+0

Windows和Mac OS X基本上是「破壞大小寫不敏感的操作系統」這個表達方式毫無幫助。雖然同樣沒有幫助,但更合理的認爲git設計不佳,因爲直接在文件系統上存儲分支名稱作爲文件名稱而不知道文件系統的功能。 – ctpenrose

+0

如果Git需要對每個操作系統的古怪行爲進行規範化處理,它將永遠不會完成。回答站。 – meagar

+0

根據你的描述,這聽起來像屬性應該被命名爲「core.forcecase」。和OP一樣,我也希望有一個名爲「ignorecase」的標誌使系統忽略大小寫(不區分大小寫)。 – thelr