有一个目录结构的远程仓库:
-directory1
-file1_1
-file1_2
...
-directory2
-file2_1
-file2_2
...
我在网站托管上有一个自定义名称的文件夹,例如" / path / public_html"。
如何在网络托管上设置git,以便我的" public_html"跟踪一个子目录" directory2"远程回购?
因此,换句话说,我想在网络托管上执行某种形式的git命令,并将public_html更新为" directory2"的最新内容。如果有帮助的话,我不在乎从网络托管中回购回购。
答案 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