【问题标题】:How to "attach" working dir to bare GIT repository如何将工作目录“附加”到裸 GIT 存储库
【发布时间】:2012-07-27 12:34:56
【问题描述】:

我有想要存储在 Git 中的嵌入式 Linux 系统。我已经在系统上安装了 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 使用工作树?

【问题讨论】:

  • 当您说“看到所有以前推送的文件都已删除且未跟踪”时,您的意思是它显示工作树正在修改,删除所有文件吗?
  • 是的,它确实显示为已修改(已删除)。
  • stackoverflow.com/questions/9745064/… 可以在这里提供帮助
  • 您是否尝试过只设置core.workTree 配置变量而不是始终传递--work-tree
  • 我认为你没有添加任何文件

标签: linux git git-bare


【解决方案1】:

您看到之前提交的文件被删除的原因是第一个存储库中的git index(只是一个名为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 实现这一目标;那么您可以从外部运行 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

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 2015-06-06
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多