2014-03-19 45 views
0

我在Windows上使用git。我有起源裸存儲庫和兩個具有相同文件結構的本地存儲庫。在firlst本地存儲庫中,我通過使用`mv git Folder \ file.txt文件夾\ file.txt'進行重命名並提交重命名來更改文件夾的大小寫。然後推到原點。在第二個本地存儲庫上,我提出了更改,但未反映該情況。當我看到該文件的日誌時,我可以看到它已重命名。沒有反映變化的原因是什麼?有趣的是,對於我重命名的其他文件夾,這些更改已反映出來。重命名不會反映當更改拉

+0

Windows有一個不區分大小寫的文件系統,它會將文件和文件夾的名稱相同但不同的情況視爲相同。 Git有一些設置可以控制這一點,但我不記得他們是什麼在我頭頂。 – 2014-03-19 10:00:44

+0

它們是'config.ignoreCase' :)。你是否認爲它應該是「錯誤」的變化被反映出來? –

回答

1

我不知道它會做的伎倆,但嘗試

  1. 更新與在HEAD什麼是指數:

    git read-tree -i HEAD 
    
  2. 刪除文件和/或目錄應該變成改名:

    del blah 
    rmdir foo 
    
  3. 強制創建工作樹fil從他們的ES版本的索引:

    git checkout-index -a -f 
    

今後要知道,Git是遺憾的是不與你的情況下處理好。這是可以理解的:在Windows上,NTFS不區分大小寫,而保留病例,並且FAT既不區分大小寫又不區分大小寫。 IOW,似乎只有沒有 Git可以展示出的這個問題的一種理性行爲:一方面它應該在提交的樹中處理'FoO/bAr.tXt',並在文件中處理'foo/bar.txt'系統是指同一個文件,另一方面它們應該是不同的東西?它不會工作,我可以想象的唯一解決方案是一些特定於Windows的攻擊,如git checkout-index --fix-work-tree-name-casing,它實際上會重命名工作樹實體以匹配索引。

更新:如已被告知elsewheregit reset --mixed HEAD可以用來代替git read-tree

+0

謝謝,我會試一試。一個問題 - 當我將這樣做'config.ignoreCase'設置爲'true'或'false'? –

+0

它工作!你能告訴我第一條命令和最後一條命令是什麼嗎? –

+2

當你運行普通的'git checkout'時,Git首先使用要檢出的文件填充索引,然後將工作樹同步到它。在一般情況下,檢查的方式很多,所以我的想法是:1)強制Git使索引中的狀態與HEAD完全匹配,並且2)強制Git在工作樹中重新創建此狀態。這些管道命令就是這樣做的。 – kostix