2015-06-26 97 views
1

我们希望使用Git在我们的Web服务器上部署代码。因此,我们在生产服务器上初始化了一个裸仓库。每当我们发布一个新版本,我们执行一个git结帐到网站的DocumentRoot:Git签出到外部工作树并删除已删除的文件

git --work-tree=/path/to/webroot/ checkout -f master 

webroot子目录,也有未通过的Git跟踪的几个文件(缓存文件,用户上传文件等等。)。这些必须当然不会被Git在执行结帐时删除(并且此部分目前工作正常)。

然而,Git的也不会删除了以前跟踪,但在此期间已被删除的文件(例如,他们在发展过程中已被删除,因为他们不再需要)。这些文件目前经历了checkout进程,导致“死”文件数量稳步增加。有没有办法让Git在执行checkout时删除这些文件?重现步骤 -

编辑:

# create dirs and repos 
cd /base/path 
mkdir repo.git 
mkdir target 
cd repo.git && git init 

# create, add and commit two files 
touch test1.txt 
touch test2.txt 
git add test1.txt test2.txt 
git commit -m testcommit 

# checkout to target directory 
git --work-tree=../target checkout master -f 
# target directory now contains both files 

# remove one file from file system and git repo, commit 
rm test2.txt 
git rm test2.txt 
git commit -m deletecommit 

# checkout to target again 
git --work-tree=../target checkout master -f 
# target still contains both files 
+0

我试图做同样的事情,你做了,它适用于我。你能创建一个最简单的例子并展示如何重现它吗? – pqnet

+0

当你说文件被删除时,你的意思是你刚刚从工作树中删除它们,还是实际上从git索引中删除了它们?例如。在这种情况下,你需要后者,通过'git rm'完成 – lemonhead

+0

我从文件系统和存储库中删除了它们。我添加了一个最小的工作示例来说明问题。 – TheWolf

回答

1

通过使用一个工作目录,对一些工作,然后又为你让他们不同步与存储库的休息休息。 Git似乎并不打算以这种方式使用。

如果你想使用多个工作目录与一个Git仓库中有可用的一些解决方案。查看计算器问题here

否则,您可以:

  • 克隆库直接进入webroot。虽然这意味着开始一个新的webroot
  • 克隆一份但不是webroot的副本,并坚持始终如一地将其与webroot一起用作其唯一工作目录(一旦您将其与现有的目录同步)。您可以使用git config core.worktree ../target将其设置为存储库默认值。
0

我用git的清洁做类似的事情。如果您不想删除的文件位于gitignore中,则可以删除所有不需要的文件。