您之前看到提交的文件被删除的原因是第一个存储库中的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