【问题标题】:Why don't I see files after push to Bare git repo为什么我在推送到 Bare git repo 后看不到文件
【发布时间】:2013-10-02 02:51:27
【问题描述】:

我有我的本地开发仓库(来源)和一个远程仓库,我使用 git init --bare 作为recommended here 创建。我也跑了git --bare update-server-info

git config --bool core.bare true

Git 远程 -v 显示

origin  http://staging.websitename.com (fetch)

origin  http://staging.websitename.com (push)

remote  ssh://user@xx.xx.xx/home/user/public_html/staging (fetch)

remote  ssh://user@xx.xx.xx/home/user/public_html/staging (push)

在此之后并运行 git push remote 或 git push -all remote,它通过并且没有给我任何错误。为什么我在远程仓库中看不到文件??

Compressing objects: 100% (4121/4121), done.
Writing objects: 100% (4242/4242), 18.70 MiB | 694 KiB/s, done.
Total 4242 (delta 495), reused 0 (delta 0)

【问题讨论】:

标签: git github ssh


【解决方案1】:

裸存储库没有工作副本,因此您不会“看到”任何文件。尝试做一个 git log,你可以看到提交。从裸仓库克隆,您将获得文件。

【讨论】:

  • 谢谢,我认为裸存储库是理想的存储库,只会被推送到,所以我打算将它用作临时服务器(所以当然需要查看文件。我应该克隆即使我不需要完整的 git 树,也可以使用本地 repo?
  • @KevinOrin:您应该将运行阶段版本与裸存储库分开,因为推送到非裸存储库存在许多问题。您可以通过在裸存储库中的更新后挂钩运行 git pull 来更新它。
  • 谢谢,但我认为我根本不需要一个 Bare repo @BenjaminBannier - 我只是想知道如何设置暂存,因为过去一个简单的“git init”导致了一个树问题当我试图推动它时。
  • 一个裸仓库只包含你的历史。普通存储库包含您的历史记录和您签出的任何分支的副本。你应该有一个裸仓库的原因是一个普通的仓库必须在某个地方签出,你不能推送到一个签出的分支(git不知道如何处理任何冲突)。
【解决方案2】:

--bare 存储库的要点是它没有工作副本(也没有索引),这意味着推送不会搞砸任何事情。

如果您希望某些推送(到一个或多个特定分支)“自动部署”,实现此目的的方法是在 --bare 存储库中使用 git 挂钩。钩子——通常是post-receive,尽管在这里可以使用pre-receiveupdate 钩子——在所有 推送上运行,所以它应该检查有问题的推送是否“有趣” (影响自动部署分支),如果是,则触发部署。

钩子是代表执行推送的进程运行的(通常作为某个用户使用 ssh,如在您的git remote -v 输出中),因此如果部署的文件应该由另一个用户拥有,您必须以某种方式进行安排。一种简单、简单且合理的方法是写入设置为模式rw-rw-rw-(每个人都可以写入)的文件,并让某些东西(例如cron 作业)定期检查文件。如果编写,cron 作业(以部署用户身份运行)可以提取适当分支的最新版本。另一种方法是联系执行此操作的服务器(人偶等)。

如果执行推送的用户 (user@xx.xx.xx) 可以拥有文件,则更简单的方法是在挂钩中运行 git checkout,但 with an alternate work-tree--bare 存储库没有其他连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2014-12-21
    • 2015-06-25
    • 2013-06-04
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多