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

Git:只签出没有存储库的文件?,git,Git,我只想签出文件,而不签出.git文件和整个存储库。这是因为我想用git管理一个网站(php和html),我正在寻找一种简单的方法从存储库中更新htdocs文件夹中的文件,而不必公开存储库。(现在它在home dir中,可以通过ssh访问,但我必须手动将新文件放到htdocs中。Git比Subversion容易得多,因为整个存储库都保存在一个目录中。您只需删除项目根目录中隐藏的“.Git”文件夹,即可创建站点的可用于生产的副本 在Linux/OSX中,这将是: mkdir dist &&a

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

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

在Linux/OSX中,这将是:

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

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

git archive -o foo.tar HEAD
scp foo.tar server:
手册页包含以下示例:

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

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

rsync -avz --exclude=.git /source/directory/ user@remote-server.com:/target-directory
也可以使用low level,该手册页包含以下示例:

使用git签出索引“导出整个树”
前缀功能基本上使使用“
git checkout index
”作为“导出为树”函数变得简单

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

git签出索引
将索引“导出”到指定目录中

rsync -avz --exclude=.git /source/directory/ user@remote-server.com:/target-directory
最后的“/”很重要。导出的名称实际上只是以指定字符串作为前缀


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

在seanhodges answer上展开,您可以将项目的文件重新同步到需要放置它们的任何位置,并使用--exclude来避免.git目录

rsync -avz --exclude=.git /source/directory/ user@remote-server.com:/target-directory
我没有测试这个命令,所以请随意编辑它,但是您得到了jist

一个有用的选项是在命令末尾添加--dry run,它将向您显示在不做任何更改的情况下将发送哪些文件。

git clone--depth 1
正是您想要的。我有一个包含41000次提交的git存储库,这要快得多。有关更详细的解释,请参阅或

如果要指定要使用的分支(而不是默认的“主”分支),请使用以下语法(需要Git 1.9+):

git clone-b--单分支--深度1ssh://username@servername.net:serverport/PathToProject

你可能会从简单的回购加上后期接收挂钩中获益

如果您希望将更改推送到服务器,但不希望htdocs本身处于版本控制之下,则此方法非常有用

我们将为裸git回购创建一个文件夹。我希望将其与htdocs放在同一个父文件夹中:

mkdir barerepo.git
cd barerepo.git
git --bare init 
然后创建一个post接收钩子文件,使其可执行:

touch hooks/post-receive
chmod ug+x hooks/post-receive
在您喜爱的文本编辑器中编辑帖子接收:

GIT_WORK_TREE=/full/path/to/htdocs git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]
现在,每次你推到这个裸repo时,它都会将工作树签出到htdocs。但是htdocs本身不受版本控制;在htdocs中运行
git status
,会出现错误
致命:不是git存储库(或装载点/数据之前的任何父项)
。它只是普通文件


请注意,您必须始终从master中推送才能执行此操作,否则
git checkout
将不知道要签出哪个分支。

离开.git并让您的Web服务器阻止对它的访问可能会更容易。关于模拟Svn导出的问题的答案可能是您需要的:git archive非常适合此操作。另外,您还可以使用git archive--remote直接从远程repo(甚至通过git://protocol iirc)构建归档文件,从而将其用作直接从中心点获取的方式。例如,
git archive--remotegit://git/mindy.git --格式化tar r3.2.0 | tar tf-
(前提是您在git守护程序配置中启用上载存档)@araqnid可能很酷,但不能与Github一起使用:当使用ssh URL
无效命令时:“git upload archive
,当使用https URL时:
致命:协议不支持操作。
git签出索引
非常有效,但请确保为
--prefix
参数使用绝对路径。我尝试了
~/…
并在我的工作目录中实际获得了一个
~
目录(因此,使用,例如
/Users/aral/…
)这有复制整个历史的缺点…如果是大型回购和网络回购,速度可能会很慢。我认为这个问题是为了最大限度地减少网络使用,而
diff
计算…在其他方面是为了最大限度地减少资源使用。你可能是对的,其他一些答案更适合这些情况,但问题是sn不需要性能关键型答案。这种方法对于许多工作流来说都是简单可行的,特别是当回购已经在目标机器上签出时。我会将它列在列表中,因为有些人发现它很有用。我对这个答案所做的唯一修改是使用
--depth=1
来防止下载整个历史。Since
.git
最终将被删除,使用
--depth=1
可以跳过最终不会保留的信息传输,并且不会改变最终结果。至于这个答案的有用性:我更愿意使用
git archive
,但正如Github下指出的那样,它不支持
git archive所以我不能使用它。下一个最好的方法是
git checkout--depth=1…&&rm-rf.git