2012-07-27 106 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 
相关问题