您之前看到提交的文件被刪除的原因是第一個存儲庫中的git index(它只是一個名爲index
的文件)與第二個存儲庫中的索引不同。第一個索引對應於工作樹,而第二個索引是未初始化的,因此沒有條目。從git status
的輸出是兩個比較的結果:
HEAD
和索引之間
- (以確定暫存的變更被提交)
- 索引和工作樹(以確定該不會是不分級的變化之間提交)
在你的情況下,在第二庫點HEAD
的承諾,其中包含所有你從你的根文件系統提交的文件,但該指數是空的。所以當git執行第一次比較時,它認爲這些文件中的每一個都在下一次提交時被刪除。
當git執行第二次比較時,它發現工作樹包含與提交相同的所有文件,但索引當然仍然是空的,所以它將這些文件視爲「新」未跟蹤文件。這就是爲什麼你看到所有文件都被刪除和未被跟蹤。
的解決方案很簡單:初始化第二個索引以便它匹配master
:
git --work-tree=/ reset
雖然我在這裏,我要指出的與您發佈的命令,一些其他問題:
- 首先,您的
git add -U
正在將所有git存儲庫元數據文件添加到存儲庫。換句話說,存儲庫正在跟蹤自己。這是由於您使用--work-tree
的方式而發生的,並且是非常差。您應該確保將存儲庫文件添加到info/exclude
或.gitignore
而忽略它們。其次,你並不是真的需要一個裸倉庫,只是一個分離的工作樹。你可以通過git config core.bare false
和export 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
當你說你「爲刪除看到所有以前壓文件,未經跟蹤」,你的意思它顯示工作樹被修改,刪除所有文件? – vergenzt 2012-07-27 13:14:00
是的,它完全顯示爲修改(刪除)。 – user1557654 2012-07-27 13:16:35
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