2012-07-27 104 views
2

我有我們想要在Git中存儲的嵌入式Linux系統。我在系統上安裝了Git,安裝了用於存儲Git數據的附加USB驅動器(裸存儲庫)。有犯有使用這樣的命令推到遠程存儲庫沒有問題:如何將工作目錄「附加」到裸GIT存儲庫

cd /media/usb 
git init --bare 
git --work-tree=/ add -A 
git --work-tree=/ commit 
git --work-tree=/ push -u origin master 

但是,當我克隆純倉庫到新的USB驅動器和調用git --work-tree=/ status我看到所有以前壓文件,刪除,和未跟蹤。如何讓Git使用工作樹?

+0

當你說你「爲刪除看到所有以前壓文件,未經跟蹤」,你的意思它顯示工作樹被修改,刪除所有文件? – vergenzt 2012-07-27 13:14:00

+0

是的,它完全顯示爲修改(刪除)。 – user1557654 2012-07-27 13:16:35

+1

http://stackoverflow.com/questions/9745064/using-git-git-dir-path-to-git-pull-path-to-other-bare-git-master-doesnt-a可以在這裏幫助 – VonC 2012-07-27 13:36:09

回答

1

您之前看到提交的文件被刪除的原因是第一個存儲庫中的git index(它只是一個名爲index的文件)與第二個存儲庫中的索引不同。第一個索引對應於工作樹,而第二個索引是未初始化的,因此沒有條目。從git status的輸出是兩個比較的結果:

    HEAD和索引之間
  1. (以確定暫存的變更被提交)
  2. 索引和工作樹(以確定該不會是不分級的變化之間提交)

在你的情況下,在第二庫點HEAD的承諾,其中包含所有你從你的根文件系統提交的文件,但該指數是空的。所以當git執行第一次比較時,它認爲這些文件中的每一個都在下一次提交時被刪除。

當git執行第二次比較時,它發現工作樹包含與提交相同的所有文件,但索引當然仍然是空的,所以它將這些文件視爲「新」未跟蹤文件。這就是爲什麼你看到所有文件都被刪除和未被跟蹤。

的解決方案很簡單:初始化第二個索引以便它匹配master

git --work-tree=/ reset 

雖然我在這裏,我要指出的與您發佈的命令,一些其他問題:

  • 首先,您的git add -U正在將所有git存儲庫元數據文件添加到存儲庫。換句話說,存儲庫正在跟蹤自己。這是由於您使用--work-tree的方式而發生的,並且是非常差。您應該確保將存儲庫文件添加到info/exclude.gitignore而忽略它們。其次,你並不是真的需要一個裸倉庫,只是一個分離的工作樹。你可以通過git config core.bare falseexport GIT_DIR=/media/usb來實現;那麼您可以從外部運行git命令(即高於/media/usb),並且您不必在每個命令中持續包含--work-tree=/作爲全局選項。

這裏是它封裝了一切,我只是覆蓋除第二個小點的完整測試情況:

#!/bin/sh 

root=fakeroot 
mkdir -p $root/media/usb{1,2} $root/{bin,etc} 
echo a > $root/bin/sh 
echo b > $root/etc/hosts 

cd $root/media/usb1 
git init --bare 

# We don't want our git repository meta-data being tracked. 
echo '/media/usb*/' >> info/exclude 

git --work-tree=../.. add -A ../.. 
git --work-tree=../.. commit -m '1st commit' 

echo c >> ../../etc/hosts 
git --work-tree=../.. add -A ../.. 
git --work-tree=../.. commit -m '2nd commit' 

git remote add origin ../usb2 
git --git-dir=../usb2 init --bare 

git push origin master 

cd ../usb2 
echo '/media/usb*/' >> info/exclude 

echo "=========================================" 
echo "index in usb2 is not yet initialized:" 
git --work-tree=../.. status 
echo "=========================================" 
echo "initialize index to master (HEAD)" 
git --work-tree=../.. reset 
echo "=========================================" 
echo "now we have a clean working tree:" 
git --work-tree=../.. status 
相關問題