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