2011-02-15 361 views
187

目前我遇到了版本庫問題,儘管我的git-fu通常很好,但似乎無法解決此問題。git克隆後直接修改的文件

當我克隆這個存儲庫,然後cd到repo中,git-status顯示已更改的幾個文件。注意:我沒有在任何編輯器或任何東西中打開回購。

我試着按照這個指南:http://help.github.com/dealing-with-lineendings/但這並沒有幫助我的問題。

我試過git checkout -- .很多次,但它似乎沒有做任何事情。

任何幫助/意見將不勝感激

更新1:我在Mac上,並有在回購本身沒有子模塊。

更新2:文件系統是Mac上的「Journaled HFS +」文件系統,不區分大小寫。這些文件是單行的,大約每個79K(是的,你聽到的權利),所以看着git diff是不是特別有用。我聽說做git config --global core.trustctime false這可能會有所幫助,當我回到計算機時,我會嘗試回購它。

更新3:用事實改變了文件系統的細節!並且,我嘗試了git config --global core.trustctime false這個效果不好的技巧。

+3

什麼`混帳diff`告訴你嗎? – 2011-02-15 22:56:56

回答

75

我明白了。所有其他開發人員都在Ubuntu上(我認爲),因此具有區分大小寫的文件系統。但是,我不(因爲我在Mac上)。事實上,當我使用git ls-tree HEAD <path>來看他們時,所有的文件都是小寫的雙胞胎。

我會讓他們中的一個把它整理出來。

50

我假設你正在使用Windows。你鏈接的那個github頁面有細節倒退。問題是,CRLF行結束一直致力於回購已經因爲你有core.autocrlf設置爲真正輸入,混帳要轉換行結束到LF這樣git status顯示每個文件被改變。

如果這是一個您只想訪問但不涉及的回購,則可以運行以下命令來僅隱藏問題而不實際解決問題。

git config core.autocrlf false 


如果是這樣,你將積極參與,並且可以更改提交到一個回購協議。您可能希望通過提交更改repo中所有行結束的提交來解決問題,以使用LF而不是CRLF,然後採取措施防止將來再次發生此問題。

下面是直接從gitattributes man page,應該從一個乾淨的工作目錄中執行。

echo "* text=auto" >>.gitattributes 
rm .git/index  # Remove the index to force git to 
git reset   # re-scan the working directory 
git status  # Show files that will be normalized 
git add -u 
git add .gitattributes 
git commit -m "Introduce end-of-line normalization" 

如果不應該在git的狀態進行歸一化顯示的任何文件,運行git add -u之前未設置其文本屬性。

manual.pdf  -text 

相反,git未檢測到的文本文件可以手動啓用規範化。

weirdchars.txt text 
+5

我沒有使用windows。 – 2011-02-15 22:05:00

+1

默認情況下,在非Windows系統上,core.autocrlf設置爲false。所以,如果它是由行結束引起的,你甚至不應該遇到這個問題。你可以給你的特殊設置的更多細節,例如:`git的diff`顯示這些文件`git的status`說被修改,還您使用的是什麼文件系統? – Arrowmaster 2011-02-15 22:45:09

+0

用這些問題的答案更新了問題。將在一兩秒鐘內再次審視所有細節。我不確定開發團隊的其他成員正在使用 – 2011-02-16 09:49:26

124

我在克隆回購軟件後在Mac上遇到了同樣的問題,它會假設所有文件都已更改。

運行後git config --global core.autocrlf input它仍將所有文件標記爲已更改。在尋找修復程序後,我在主目錄中遇到了.gitattributes文件,其中包含以下內容。

* text=auto 

我評論它,從現在起任何其他克隆庫工作正常。希望這可以幫助那裏的任何人。

3

我有同樣的問題。還有一臺Mac。看着一臺Linux機器,我注意到在回購我有兩個文件:

geoip.dat和GeoIP.dat

刪除了Linux機器上棄用之一,再次克隆庫的MAC地址。當存在重複時,我無法從存儲庫的副本中提取,提交,存儲或提取。

14

在Visual Studio中,如果您使用的是Git,則可以自動生成.gitignore和.gitattributes文件。自動生成的.getattributes文件具有以下行:

* text=auto 

此行靠近文件頂部。我們只需要通過在其前面添加#來評論該行。這樣做後,事情按預期運作。

1

我也有同樣的問題。在我的情況下,我克隆了回購和一些文件立即失蹤。

這是由文件的路徑引起的,文件名對於Windows來說太長。爲了解決這個問題,請儘可能地將回購點儘可能地克隆到hdd根目錄,以減少文件路徑的長度。將它克隆到C:\ A \ GitRepo而不是C:\ Users文檔\ yyy \ Desktop \ GitRepo

3

我想添加一個更直接的「爲什麼」發生這種情況的答案,因爲已經有一個很好的答案要解決這個問題。

因此,.gitattributes有一個* text=auto設置,這會導致此問題。

在我的情況GitHub的主分支上的文件有\r\n結尾。我已撥打回購登錄設置,以\n結尾辦理登機手續。我不知道git檢查了什麼。它應該檢查與我的Linux機器上的本機結尾(\n),但我想它檢出了\r\n結尾的文件。 Git抱怨,因爲它看到已檢出的\r\n結尾在回購中,並警告我它將檢查\n設置。因此文件被「修改」。

這是我現在的理解。

10

也可以從不同的文件權限出現的問題,是我的情況:

新鮮克隆庫(在Windows,Cygwin的):

$ git ls-tree HEAD 
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904 testfile 
    ↑↑↑ 

裸遠程存儲庫(Linux的):

$ git ls-tree HEAD 
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904 testfile 
    ↑↑↑ 
21

請運行以下命令。這可能會解決這個問題。

# Remove everything from the index. 
git rm --cached -r . 

# Write both the index and working directory from git's database. 
git reset --hard 
0

我將本地存儲庫複製到另一個文件夾,並顯示了一堆修改後的文件。 我的解決方法是:我藏匿修改後的文件,並刪除了藏匿。存儲庫變得乾淨。

54
git config core.fileMode false 

在我的情況下,解決了這個問題

https://www.kernel.org/pub/software/scm/git/docs/v1.7.10.1/git-config.html

TL; DR;

core.fileMode

如果爲false,索引和工作樹之間的可執行位的差異被忽略;對破碎的文件系統如FAT很有用。請參閱git-update-index(1)。

默認值是正確的,除了GIT中克隆(1)或GIT-INIT(1)將探測並設置core.fileMode假如果合適的話在創建存儲庫時。

0

我發現的git是治療我的文件(.PSD在這種情況下)爲文本。將它設置爲.gitattributes中的二進制類型解決了它。

稱爲
*.psd binary 
1

編輯文件:sudo gedit .git/configsudo vim .git/config

[core] 
    repositoryformatversion = 0 
    filemode = false 
    bare = false 
    logallrefupdates = true 
[remote "origin"] 
    url = [email protected]:DigitalPlumbing/unicorn-magento.git 
    fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
[branch "productapproval"] 
    remote = origin 
    merge = refs/heads/productapproval 

變化FILEMODE =真FILEMODE =假