Git:只签出没有存储库的文件?

时间:2010-05-19 14:22:01

标签: git

我想在没有.git文件和整个存储库的情况下签出文件。这是因为我想用git管理一个网站(php& html),我正在寻找一种简单的方法来从存储库更新htdocs文件夹中的文件,而不需要公开存储库。 (现在它在home-dir中并通过ssh访问,但我必须手动将新文件放到htdocs。

6 个答案:

答案 0 :(得分:31)

git-archive联机帮助页包含以下示例:

  

git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)

     
    

创建一个tar存档,其中包含当前分支上最新提交的内容,并将其解压缩到'/ var / tmp / junk'目录中。

  

或者您可以使用低级git-checkout-index,该联机帮助页包含以下示例:

  

使用git checkout-index“导出整个树”

     
    

前缀功能基本上使用“git checkout-index”作为“导出为树”功能变得微不足道。只需将所需的树读入索引,然后执行

   $ git checkout-index --prefix=git-export-dir/ -a
         

git checkout-index会将索引“导出”到指定的目录中。

         

最后的“/”很重要。导出的名称实际上只是以指定的字符串为前缀。

  

或者您可以尝试使用--work-tree选项来git包装器或GIT_WORK_TREE环境变量,例如使用“git --work-tree=/somwehere/else checkout -- .”。

答案 1 :(得分:9)

Git比Subversion容易得多,因为整个存储库都保存在一个目录中。您只需要删除项目根目录中隐藏的“.git”文件夹,即可创建站点的生产就绪副本。

在Linux / OSX中,这将是:

mkdir dist && cd dist
git checkout http://path/to/your/project.git
rm -rf .git

答案 2 :(得分:8)

git clone --depth 1完全符合您的要求。我有一个拥有41,000次提交的git存储库,这个速度要快得多。有关更详细的说明,请参阅this answerthis more general response

如果要指定要使用的分支(而不是默认的" master"分支),请使用此语法(需要Git 1.9 +):

git clone -b <remoteBranch> --single-branch --depth 1 ssh://username@servername.net:serverport/PathToProject <FolderName>

答案 3 :(得分:5)

您可以在git工作目录中创建tar存档,并将tar复制到服务器:

git archive -o foo.tar HEAD
scp foo.tar server:

答案 4 :(得分:2)

扩展seanhodges的答案,您可以将项目的文件rsync到您需要放置它们的位置并使用--exclude以避免.git目录。

rsync -avz --exclude=.git /source/directory/ user@remote-server.com:/target-directory

我没有测试该命令,所以可以随意编辑它,但是你得到了这个命令。

一个有用的选项是在命令的末尾添加--dry-run,它将显示将发送哪些文件而不实际进行任何更改。

答案 5 :(得分:1)

您可能会受益于裸机还有后接收机。

如果您希望将更改推送到服务器但不希望htdoc本身受版本控制,则此方法很有用。

我们将为裸git repo创建一个文件夹。我喜欢将它放在与htdocs相同的父文件夹中:

mkdir barerepo.git
cd barerepo.git
git --bare init 

然后创建一个post-receive钩子文件,使其可执行:

touch hooks/post-receive
chmod ug+x hooks/post-receive

在您喜欢的文本编辑器中编辑post-receive:

GIT_WORK_TREE=/full/path/to/htdocs git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

现在每次推送到这个裸仓库时,它都会将工作树签出到htdocs。但是htdocs本身并没有受版本控制;在htdocs中运行git status将给出错误fatal: Not a git repository (or any parent up to mount point /data)。这只是简单的文件。

请注意,您必须始终从master转到此工作,否则git checkout将无法知道要检出的分支。