繁体   English   中英

如何将工作目录“附加”到裸露的GIT存储库

[英]How to “attach” working dir to bare GIT repository

我有要存储在Git中的嵌入式Linux系统。 我已经在系统上安装了Git,安装了用于存储Git数据的其他USB驱动器(裸存储库)。 使用这样的命令来提交并推送到远程存储库没有问题:

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 --work-tree=/ status跟踪。 如何告诉Git使用工作树?

您看到先前提交的文件被删除的原因是,第一个存储库中的git 索引 (简称为index的文件)与第二个存储库中的索引不同。 第一个中的索引对应于工作树,而第二个中的索引未初始化,因此没有条目。 git status的输出是两个比较的结果:

  1. HEAD和索引之间(确定要落实的分阶段更改)
  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 那么您可以从外部(即/media/usb上方)运行git命令,而不必在每个命令中连续包含--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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM