为什么git签出从裸回购中删除而不是创建?

为什么git签出从裸回购中删除而不是创建?,git,git-submodules,git-checkout,git-bare,Git,Git Submodules,Git Checkout,Git Bare,这有点奇怪,如果它在我的特定环境之外没有太多的应用,我提前道歉。我使用git来管理我的部署包,方法是提交并标记一组生成的与部署相关的文件以及指向发布代码的子模块。我正在尝试从每台机器上的一个裸repo到一个不同的空目录中对这个部署标记进行git签出。我得到的输出表明它已经删除了应该创建的文件,之后工作树目录仍然为空 $ ls -al /var/www/test/ total 0 $ git --bare --work-tree=/var/www/test/ checkout my_tag D

这有点奇怪,如果它在我的特定环境之外没有太多的应用,我提前道歉。我使用git来管理我的部署包,方法是提交并标记一组生成的与部署相关的文件以及指向发布代码的子模块。我正在尝试从每台机器上的一个裸repo到一个不同的空目录中对这个部署标记进行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_标记引用的提交和tip of 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。

基本问题是,
签出
将所需修订(
我的标签
)与
--bare
repo中的
中的内容进行比较。(而且,
--bare
参数没有做任何事情。)因此,使用
我的标签
,它表示您已经处于分离的
头部
模式,处于所需的rev-i,即,它不应该更改
头部
,并查看目标目录,
/var/www/test/
,并查看文件已被删除,并为每个文件提供
D
状态。它假设它们是因为索引而存在的(见下文)

当您切换到
签出主控
时,它会显示:好的,您正在从这个分离的-
移动到
主控
,它会更新
,并签出更改的文件。但是
.gitmodules
my_tag
head
中是相同的,因此保持
D
元素

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


Git还有一个坏习惯:-)使用
$Git\u DIR/index
记录它在签出时所做的操作,以及
$Git\u DIR/HEAD
。当从您试图部署的东西中删除文件时,这会导致留下文件。如果在执行
签出-f
之前清空了目标目录,则应该可以。(或者,在环境中设置
GIT_INDEX_FILE
,为每个独特部署保留的文件命名。我没有尝试过这种方法,但它应该可以很好地工作。)

感谢您的回复,这对我有所帮助,但我仍然缺少工作树中的.gitmodules。我想这是因为文件在回购协议的生命周期中从来没有改变过,所以没有结帐会认为它是一个值得更改的文件吗?(仅供参考,工作树目录将始终为空,它是在此部署过程中创建的。)实际上,我错了。我确实在签出时得到了.gitmodules,我只是使用了一个“ll”别名,在这个服务器上不会显示隐藏的文件。对不起!谢谢你的回答,这正是我需要的。当心!