这有点奇怪,如果在我的具体情况之外没有太多应用,我会提前道歉。我使用git来管理我的部署包,方法是提交和标记一组与部署相关的生成文件和一个指向发布代码的子模块。我试图将这个部署标记的git checkout从每台计算机上的一个裸仓库进行到另一个空目录。我得到的输出表明它已经删除了应该创建的文件,之后工作树目录仍为空。
$ 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
问题是,“release”是一个git子模块,如果没有.gitmodules我就无法初始化或更新它,所以75%的方式仍然不够好。
这个问题的一个解决方案是每次部署时简单地重新克隆repo,如果没人能提出更好的解决方案,我可能会这样做。但理想情况下,我想在每台机器上保留一个简单的仓库,并每次从那里结账到新的工作树。谁能告诉我这里发生了什么?
供参考,我正在使用Git 1.8.2.1。
答案 0 :(得分:0)
基本问题是checkout
正在将所需的修订版本(my_tag
,master
)与HEAD
回购邮件--bare
中的版本进行比较。 (并且--bare
参数什么都不做。)因此,对于my_tag
,它表示您已经处于分离的HEAD
模式并且处于期望的转换状态,即它不应该更改{{ 1}} - 并查看目标目录HEAD
,并查看文件已被删除,并为每个文件提供/var/www/test/
状态。它假定它们在那里是因为索引(见下文)。
当您切换到D
时,它会显示:好的,您正在从已分离的checkout master
移至HEAD
,它会更新master
并检查更改后的内容文件。但HEAD
和.gitmodules
中的my_tag
相同,因此仍有head
个。{/ p>
如果您使用D
,则会认为它应该替换丢失的文件。
Git也有坏习惯:-)使用checkout -f
来记录结账时的情况,以及$GIT_DIR/index
。当从您尝试部署的东西中删除文件时,这会导致留下文件。如果在执行$GIT_DIR/HEAD
之前清空了目标目录,那应该没问题。 (或者,在环境中设置checkout -f
,命名与每个唯一部署一起保存的文件。我没有尝试过这个但它应该运行良好。)