我有嵌入式 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 使用工作树?
最佳答案
您看到以前提交的文件被删除的原因是 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=/
作为全局每个命令中的选项。
这是一个完整的测试用例,它封装了我刚刚介绍的所有内容,除了第二个 Gist :
#!/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
关于linux - 如何将 "attach"工作目录到裸 GIT 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11687868/