在unix中,我們擁有git裸存儲庫,它具有僅在不同情況下具有不同名稱的文件。Git-windows區分大小寫的文件名無法正確處理
實施例:
GRANT.sql
grant.sql
當我們克隆從UNIX純倉庫中的窗戶框,git的狀態檢測該文件作爲修改。工作樹只加載grant.sql,但git狀態會比較grant.sql和GRANT.sql,並顯示在工作樹中修改的文件。
我試過使用core.ignorecase false但結果是一樣的。
有什麼辦法解決這個問題嗎?
在unix中,我們擁有git裸存儲庫,它具有僅在不同情況下具有不同名稱的文件。Git-windows區分大小寫的文件名無法正確處理
實施例:
GRANT.sql
grant.sql
當我們克隆從UNIX純倉庫中的窗戶框,git的狀態檢測該文件作爲修改。工作樹只加載grant.sql,但git狀態會比較grant.sql和GRANT.sql,並顯示在工作樹中修改的文件。
我試過使用core.ignorecase false但結果是一樣的。
有什麼辦法解決這個問題嗎?
我不確定這甚至是可能的。在一個文件的情況下,Git的ignorecase處理差異。它無法在Window的無法在一個目錄中有兩個文件名的情況下區分大小寫。
FWIW,具有兩個相同的文件名,但對於他們的情況是一個非常糟糕的主意,即使在Unix上。
如果只有Linux內核的開發人員都同意你的意見...... – 2013-02-06 12:42:24
Windows不區分大小寫(更精確地說,是病例保留)。兩種文件的存在根本沒有可能的方式,其名稱僅在大小寫不同的情況下存在:兩種僅在大小寫不同的文件名是相同的文件名。期。
因此,Git正在存儲庫中檢查一個文件,直到遇到兩個問題文件中的第一個文件。 Git檢查出來,然後進一步瞭解它的業務,直到它遇到第二個文件。再次,Git檢查出來。由於從Windows的角度來看,文件名與第一個文件名相同,第一個文件只是被第二個文件覆蓋。現在讓Git認爲第一個文件被更改爲與第二個文件具有相同的內容。
請注意,這與Git無關:如果您有tarball,zipfile或Subversion存儲庫,則會發生同樣的情況。
如果您想在多個不同的平臺上進行開發,您必須尊重這些平臺的限制,並且您必須將自己侷限於您支持的所有平臺的最低公分母。 Windows支持ADS,Linux不支持。 OSX支持資源分叉,Windows不支持。 BSD支持區分大小寫,Windows不支持。所以,你不能使用任何這些。就是那樣子。
core.ignorecase
不會幫你在這裏,因爲那句柄正好對着對面的問題。
我剛遇到類似的問題。在我的情況下,名稱相似的兩個文件僅在大小寫不同的子目錄中與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.sql
和grant.sql
與Windows克隆無關,則可以將它們的名稱添加到.git/info/sparse-checkout
以明確排除這些文件。
Cygwin比MSys更好地處理文件名中的大小寫敏感和有趣的字符。
更改此註冊表項,以在Windows中啓用區分大小寫:
HKLM \系統\ CurrentControlSet \控制\會話管理器\核心\則會出現此問題= 0
見here在一些注意事項如何區分大小寫支持在Cygwin。
如果您想讓您的存儲庫對不區分大小寫的文件系統保持友好,則可以添加一個提交掛鉤,以防止您檢入衝突文件。
#!/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,避免因沒有按規定未跟蹤文件。
真正解決這個問題的最簡單方法是重命名這些文件之一,所以他們不會像Windows或OS X.
不區分大小寫的文件系統上的衝突之後從Linux提交/ Unix系統,你可以最輕鬆地解決這個問題,拉一下後,Windows上的一切都會很好。爲了防止發生這個問題,你需要添加一個類似於djjeck建議的提交鉤子。
這種情況的Windows上的症狀是非常混亂,包括:
均顯示變化由於兩個文件名稱的文件
真棒問題和格雷格的答案只是岩石! – Hazok 2011-05-20 20:07:26
當您在Windows上的不同分支中創建具有不同外殼的文件時,也會發生這種情況。 – Thomas 2017-03-15 15:35:39