2010-03-27 29 views
31

在unix中,我們擁有git裸存儲庫,它具有僅在不同情況下具有不同名稱的文件。Git-windows區分大小寫的文件名無法正確處理

實施例:

GRANT.sql 
grant.sql 

當我們克隆從UNIX純倉庫中的窗戶框,git的狀態檢測該文件作爲修改。工作樹只加載grant.sql,但git狀態會比較grant.sql和GRANT.sql,並顯示在工作樹中修改的文件。

我試過使用core.ignorecase false但結果是一樣的。

有什麼辦法解決這個問題嗎?

+0

真棒問題和格雷格的答案只是岩石! – Hazok 2011-05-20 20:07:26

+0

當您在Windows上的不同分支中創建具有不同外殼的文件時,也會發生這種情況。 – Thomas 2017-03-15 15:35:39

回答

4

我不確定這甚至是可能的。在一個文件的情況下,Git的ignorecase處理差異。它無法在Window的無法在一個目錄中有兩個文件名的情況下區分大小寫。

FWIW,具有兩個相同的文件名,但對於他們的情況是一個非常糟糕的主意,即使在Unix上。

+0

如果只有Linux內核的開發人員都同意你的意見...... – 2013-02-06 12:42:24

36

Windows不區分大小寫(更精確地說,是病例保留)。兩種文件的存在根本沒有可能的方式,其名稱僅在大小寫不同的情況下存在:兩種僅在大小寫不同的文件名是相同的文件名。期。

因此,Git正在存儲庫中檢查一個文件,直到遇到兩個問題文件中的第一個文件。 Git檢查出來,然後進一步瞭解它的業務,直到它遇到第二個文件。再次,Git檢查出來。由於從Windows的角度來看,文件名與第一個文件名相同,第一個文件只是被第二個文件覆蓋。現在讓Git認爲第一個文件被更改爲與第二個文件具有相同的內容。

請注意,這與Git無關:如果您有tarball,zipfile或Subversion存儲庫,則會發生同樣的情況。

如果您想在多個不同的平臺上進行開發,您必須尊重這些平臺的限制,並且您必須將自己侷限於您支持的所有平臺的最低公分母。 Windows支持ADS,Linux不支持。 OSX支持資源分叉,Windows不支持。 BSD支持區分大小寫,Windows不支持。所以,你不能使用任何這些。就是那樣子。

core.ignorecase不會幫你在這裏,因爲那句柄正好對着對面的問題。

+2

+1的詳細解釋 – cctan 2012-02-23 08:46:46

+1

修復這並不意味着它只是工作。 解決這個問題意味着你將瘋狂的行爲轉化爲明確的錯誤。 – jrodman 2016-01-30 18:37:25

+1

絕對有兩種文件的存在方式,其名稱只有大小寫不同,但它需要註冊表更改。 Cygwin做到了,但我不知道msys是否可以(需要將特殊標誌傳遞給Win32 API):https://cygwin.com/cygwin-ug-net/using-specialnames.html – Matt 2016-03-16 20:50:33

32

我剛遇到類似的問題。在我的情況下,名稱相似的兩個文件僅在大小寫不同的子目錄中與Windows克隆無關。 Git 1.7有一個sparse checkout功能,可讓您從工作副本中排除某些文件。要排除此目錄:

git config core.sparsecheckout true 
echo '*' >.git/info/sparse-checkout 
echo '!unwanted_dir/' >>.git/info/sparse-checkout 
git read-tree --reset -u HEAD 

在此之後,unwanted_dir/子目錄已完全從我的工作拷貝不見了和Git繼續與文件的其他部分正常工作。

如果您的GRANT.sqlgrant.sql與Windows克隆無關,則可以將它們的名稱添加到.git/info/sparse-checkout以明確排除這些文件。

+1

This答案太棒了,並且對於文件名太長的問題也適用。感謝您解除我所遇到的頭痛!幾個月前給+1。 – Hazok 2011-05-20 19:58:19

+1

偉大的解決方案!我需要設置爲'core.sparseCheckout'才能使之起作用 – 2011-09-28 22:50:09

+1

該提示非常有幫助!真棒! – Fei 2015-09-02 05:49:59

1

Cygwin比MSys更好地處理文件名中的大小寫敏感和有趣的字符。

更改此註冊表項,以在Windows中啓用區分大小寫:

HKLM \系統\ CurrentControlSet \控制\會話管理器\核心\則會出現此問題= 0

here在一些注意事項如何區分大小寫支持在Cygwin。

2

如果您想讓您的存儲庫對不區分大小寫的文件系統保持友好,則可以添加一個提交掛鉤,以防止您檢入衝突文件。

#!/bin/bash 

# Save current state 
git stash -u -q --keep-index || exit 1 

# Get the list of clashing files in the whole repository 
CLASHING=`find "$(git rev-parse --show-toplevel)" | sort | uniq -d -i` 

# Restore previous state 
git stash pop -q 

if [[ $CLASHING ]]; then 
    echo "Found clashing files on case-insensitive file systems" 
    echo "$CLASHING" 
    exit 1 
fi 

exit 0 

這個腳本需要Git版本> = 1.7.7,因爲它使用藏匿-u,避免因沒有按規定未跟蹤文件。

+1

它可能會在'.gitignore'中的未跟蹤文件上失敗。 – djjeck 2013-01-02 02:55:19

+0

有誰知道如何獲得當前樹,包括階段性變化?注意,簡單地將'git diff --staged'附加到'HEAD'還不夠好;例如,當你改變一個文件名的情況下它不會工作。 – djjeck 2013-01-02 02:57:33

+0

偉大的解決方案。說「不要那樣做」是非常無益的。我不認爲一個合理的商店會允許兩個文件或文件夾,即使他們使用Linux也僅在不同情況下有所不同。 – 2015-07-22 19:52:20

1

真正解決這個問題的最簡單方法是重命名這些文件之一,所以他們不會像Windows或OS X.

不區分大小寫的文件系統上的衝突之後從Linux提交/ Unix系統,你可以最輕鬆地解決這個問題,拉一下後,Windows上的一切都會很好。爲了防止發生這個問題,你需要添加一個類似於djjeck建議的提交鉤子。

這種情況的Windows上的症狀是非常混亂,包括:

  • 文件一直顯示,即使你回覆他們,這使得改變分支或基礎重建非常困難,因爲改變。只有在情況下,不同的混帳GUI

均顯示變化由於兩個文件名稱的文件

  • 兩份不能在不區分大小寫的平臺共存,你必須改變文件名中的一個,以避免麻煩。

  • 相關問題