Git push命令未在远程服务器上更新文件。

4

我在本地机器上设置了一个git仓库,并在linode服务器上设置了一个裸仓库。当执行git push命令时,没有任何错误出现,但是我在远程服务器上看不到文件。我执行的命令序列如下:

在远程服务器上:

abhijat@kangaroo:~$ mkdir dev
abhijat@kangaroo:~$ cd dev && git init --bare

在本地机器上:

krypton:test abhijat$ git init
krypton:test abhijat$ vim app.py
krypton:test abhijat$ git init
Initialized empty Git repository in /Users/abhijat/dev/test/.git/
krypton:test abhijat$ git add .
krypton:test abhijat$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   app.py
#
krypton:test abhijat$ git commit -m 'test first commit'
[master (root-commit) 3bee148] test first commit
 1 files changed, 16 insertions(+), 0 deletions(-)
 create mode 100644 app.py
krypton:test abhijat$ git remote add origin abhijat@linode:~/dev
krypton:test abhijat$ git push -v origin master
Pushing to abhijat@linode:~/dev
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 298 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To abhijat@linode:~/dev
   01a0e08..2273564  master -> master

但是当我在Linode上检查时,该文件不存在:
abhijat@kangaroo:~/dev$ ls -ltr
total 32
drwxr-xr-x  4 abhijat abhijat 4096 Sep  8 10:17 refs
drwxr-xr-x  2 abhijat abhijat 4096 Sep  8 10:17 info
drwxr-xr-x  2 abhijat abhijat 4096 Sep  8 10:17 hooks
-rw-r--r--  1 abhijat abhijat   73 Sep  8 10:17 description
drwxr-xr-x  2 abhijat abhijat 4096 Sep  8 10:17 branches
-rw-r--r--  1 abhijat abhijat   23 Sep  8 10:17 HEAD
-rw-r--r--  1 abhijat abhijat   66 Sep  8 10:57 config
drwxr-xr-x 12 abhijat abhijat 4096 Sep  8 11:03 objects
abhijat@kangaroo:~/dev$ find . -name app.py
abhijat@kangaroo:~/dev$

这里我是否遗漏了一些明显的东西?通信是通过ssh进行的,密钥已经按预期设置好,我可以无密码登录。然而,文件并没有被复制到远程服务器。

谢谢

3个回答

5
如果您想要同时将代码推送到仓库并更新文件,您可以创建一个服务器端的git钩子,在文件被推送后检出文件。在服务器端的git /hooks/目录中创建一个名为post-receive的文件,并添加以下代码:
#!/bin/sh
git --work-tree=/var/www/domain.com --git-dir=/var/repo/site.git checkout -f

然后使用chmod +x post-receive为文件赋予适当的权限。
注意:上述代码假定您的git目录和部署文件位于不同目录中。根据您想要配置的方式更新该文件。
更多信息和详细解释请参考:https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps

4

在服务器端,Git的工作方式与此不同。文件被高度压缩并分组成块,因此您无法找到特定的文件。

要测试您的Git服务器,请在另一个目录中创建另一个克隆,并查看是否存在app.py文件。

git clone abhijat@linode:~/dev dev2

啊,这是我完全忽略了的事情。我在服务器上克隆了存储库,然后看到了那个文件。所以我想现在的工作流程将是本地开发,推送到Linode,然后登录到Linode并克隆存储库。感谢您的帮助。 - abhijat
这是否意味着要拥有客户端-服务器风格的架构,您需要拥有两个客户端(一个在客户端,一个在服务器上)+一个神秘的仓库(在服务器上)? - Sridhar Sarnobat
从DigitalGhost的回答中我所理解的是,这个想法是我推送到的存储库并不包含原始文件,但它有能力在克隆操作的一部分中提供文件。因此,您始终需要一个服务器(当然),但它不会提供明文文件,客户端(无论在何处,远程或本地)都需要克隆存储库内容。 - abhijat
这里的关键点是你在远程(kangaroo)上有一个“裸”仓库。 裸仓库没有本地检出 - 本地工作树。 这是使用git与您正在推送文件的远程工作的标准方式。 您可以将文件推送到远程的非裸仓库,但必须覆盖标准git设置。 可能最好使用Kyle Chadha下面建议的两个仓库解决方案。 - jomofrodo

0

我正在开发一个项目,将仓库的分支/修订版本/标签的内容呈现在虚拟文件系统上。它基于fuse和libgit2。目前处于非常早期的阶段,但它可以显示修订版本中的文件/目录及其内容。如果您要使用一个分支,如果该分支被移动,它将实时刷新虚拟文件系统。以防万一:只有早期阶段,所以没有LFS,没有子模块,没有......您想到的任何花哨功能?没有那些。只有git术语中的树和blob。

https://github.com/eantoranz/gitmod


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接