1

这有点奇怪,如果在我的具体情况之外没有太多应用,我提前道歉。我正在使用 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。

4

1 回答 1

0

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

当您切换到 时checkout master,它会显示:好的,您正在从这个 detached- 移动HEADmaster,它会更新HEAD并检查更改的文件。But在and.gitmodules中是一样的,所以一个仍然被选中。my_tagheadD

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

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

于 2013-10-17T23:22:10.810 回答