【问题标题】:Why does git checkout from a bare repo delete instead of creating?为什么 git checkout 从一个裸仓库删除而不是创建?
【发布时间】:2013-10-17 22:14:22
【问题描述】:

这有点奇怪,如果在我的具体情况之外没有太多应用,我提前道歉。我正在使用 git 通过提交和标记一组与部署相关的生成文件和指向发布代码的子模块来管理我的部署包。我正在尝试从每台机器上的裸仓库中将此部署标签的 git 签出到不同的空目录中。我得到的输出表明它已经删除了它应该创建的文件,并且工作树目录之后仍然是空的。

$ ls -al /var/www/test/
total 0

$ git --bare --work-tree=/var/www/test/ checkout my_tag
D   .gitmodules
D   generated.tgz
D   release
D   signatures.md5
HEAD is now at 8946ff5... Generated contents of deployment package.

$ ls -al /var/www/test/
total 0

我应该声明 my_tag 引用的提交和 master 的提示都具有相同的 4 个文件(尽管内容不同)。这让我感到奇怪的是,以下过程让我走了 75% 的路:

$ git --bare --work-tree=/var/www/test/ checkout master
D   .gitmodules
Previous HEAD position was 8946ff5... Generated contents of deployment package.
Switched to branch 'master'

$ ls -al /var/www/test/
total 4
-rw-r--r-- 1 root root    0 Oct 17 17:00 generated.tgz
drwxr-xr-x 2 root root 4096 Oct 17 17:00 release
-rw-r--r-- 1 root root    0 Oct 17 17:00 signatures.md5

$ git --bare --work-tree=/var/www/test/ checkout my_tag
D   .gitmodules
(---- git's warning about detached HEAD state cut ----)
HEAD is now at 8946ff5... Generated contents of deployment package

$ ls -al /var/www/test/
total 4624
-rw-r--r-- 1 root root 2103765 Oct 17 17:02 generated.tgz
drwxr-xr-x 2 root root    4096 Oct 17 17:00 release
-rw-r--r-- 1 root root 2614883 Oct 17 17:02 signatures.md5

问题是,“发布”是一个 git 子模块,没有 .gitmodules 我无法初始化或更新它,所以 75% 的方法仍然不够好。

这个问题的一个解决方案是每次部署时都简单地重新克隆 repo,如果没有人能提出更好的解决方案,也许我会这样做。但理想情况下,我想在每台机器上保留一个裸仓库,每次都从该仓库签出到新的工作树。谁能告诉我这是怎么回事?

作为参考,我使用的是 Git 1.8.2.1。

【问题讨论】:

    标签: git git-submodules git-checkout git-bare


    【解决方案1】:

    基本问题是checkout 将所需修订版(my_tagmaster)与HEAD 中的内容进行比较--bare repo。 (而--bare 参数什么也不做。)因此,对于my_tag,它表示您已经处于分离HEAD 模式并且处于所需的转速——即它不应该改变HEAD——并查看目标目录/var/www/test/,并看到文件已被删除,并为每个文件提供D 状态。它假设他们在那里是因为索引(见下文)。

    当您切换到checkout master 时,它显示:好的,您正在从这个分离的HEAD 移动到master,它会更新HEAD 并检查更改的文件。但是.gitmodulesmy_taghead 中是相同的,所以仍然是Deleted。

    如果您使用checkout -f,它将假定它应该替换丢失的文件。

    Git 还有一个坏习惯 :-) 使用$GIT_DIR/index 来记录它在结帐时所做的事情,以及$GIT_DIR/HEAD。当从您尝试部署的东西中删除文件时,这会导致遗留文件。如果在执行checkout -f 之前清空目标目录,那应该没问题。 (或者,在环境中设置GIT_INDEX_FILE,为每个独特的部署命名一个您保留的文件。我没有对此进行过实验,但它应该可以正常工作。)

    【讨论】:

    • 感谢您的回复 torek,这有所帮助,但我仍然缺少工作树中的 .gitmodules。我认为这是因为该文件在 repo 的生命周期内从未更改过,因此没有结帐会认为它是值得创建的更改文件? (仅供参考,工作树目录将始终为空,它是在此部署过程中创建的。)
    • 其实我错了。我确实通过该结帐获得了 .gitmodules,我只是使用了此服务器上的“将”别名,它不会显示隐藏文件。对于那个很抱歉!感谢您的回答,这正是我所需要的。保重!
    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多