如何将git repo子目录检出到当前目录?

时间:2018-01-24 12:20:10

标签: git

有一个目录结构的远程仓库:

-directory1
    -file1_1
    -file1_2
    ...
-directory2
    -file2_1
    -file2_2
    ...

我在网站托管上有一个自定义名称的文件夹,例如" / path / public_html"。

如何在网络托管上设置git,以便我的" public_html"跟踪一个子目录" directory2"远程回购?

因此,换句话说,我想在网络托管上执行某种形式的git命令,并将public_html更新为" directory2"的最新内容。如果有帮助的话,我不在乎从网络托管中回购回购。

4 个答案:

答案 0 :(得分:11)

您无法直接克隆directory2 内容,只能directory2 其内容,这意味着您始终拥有directory2/个文件夹你的磁盘。

如果您想在directory2中看到public_html内容(意思是不是 public_html/directory2/...),那么您需要一个符号链接。

话虽这么说,您仍然可以克隆并结帐 directory2文件夹,而不是克隆完整的回购,如" Is it possible to do a sparse checkout without checking out the whole repository first?&#34中所述;

那是:

git init /a/path
cd /a/path
git config core.sparseCheckout true
git remote add -f origin /url/remote/repo
echo "directory2/" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

这会产生一个a/path/directory2文件夹,而不是public_html symlink可以。{/ p>

如果directory2中的public_html文件夹没有打扰您,那么您可以在public_html而不是a/path重复上述命令。

答案 1 :(得分:6)

如何在主机上克隆整个仓库并在目录public_html -> directory2之间使用符号链接

答案 2 :(得分:4)

这是直截了当的git read-tree工作。随时随地在网络服务器上制作一个简单的git仓库。为部署目录中的内容保留一个清单aka索引,并使用预先接收处理您的更新,如下所示:

#!/bin/sh
while read old new ref; do [[ $ref = refs/heads/deploy ]] && {
    export GIT_INDEX_FILE=$GIT_DIR/deployment-manifest
    export GIT_WORK_TREE=/path/public-html
    git read-tree -um `git write-tree` $new:directory2 || exit 1
}; done

然后将您想要部署的内容推送到网络服务器的部署分支,例如git push server master:deploy

git read-tree从存储库对象数据库中的任何树加载索引,该索引是清单,是放在工作树中的内容的列表。它将您命名的树读入索引。它是结帐和重置以及合并的主力,例如使用-um选项更新结帐或快进合并的工作树。对于您想要的任何内容,您可以保留所需的任何索引。便利包装器为一组内容保留一个索引,并始终更新名为HEAD的引用以匹配他们正在使用的任何内容,但这纯粹是传统的。

注意 如果在部署树中更改了以这种方式部署的某个文件,则git read-tree此处和推送将失败,因为git赢了&# 39; t覆盖你还没有告诉过的内容。

答案 3 :(得分:1)

  

我不在乎从网络托管中推回回购

在这种情况下,您可以使用archive命令。像这样:

git archive --remote=remote_repo --format=tar branch_name  path/to/directory2 > /path/public_html/dir2.tar && cd /path/public_html && tar xvf dir2.tar
相关问题