如何检查远程Git存储库的状态?

时间:2013-09-20 17:13:25

标签: git

我有一个远程Git存储库,我可以通过SSH从本地存储库中推送/拉出。我可以使用Git status命令检查本地仓库中未跟踪/未分页的文件。如何使用远程仓库执行相同的操作?请注意,我不是在寻找本地提交和远程提交之间的区别。

2 个答案:

答案 0 :(得分:5)

(正如评论中所要求的,这是“回答”表格中的两条评论。由于这里有更多空间,我已经扩展了一些。)

如果你有一个git远程仓库,你可以git push通过SSH,它通常应该 1 --bare回购(参见description of setting up a bare repo on a server in the on-line git book) 。一个简单的回购没有地方可以做任何工作。这意味着git status无需报告 - 实际上,如果您有一个裸仓库并且cd,则会收到一条错误消息:它需要一个工作目录才能报告任何内容。)

裸仓库的技术定义是git config --get --bool core.bare打印true的定义。我在/tmp/t开了一个非裸仓库,在这里开始:

$ cd /tmp/t; git config --get --bool core.bare
false
$ cd /tmp; git clone --bare t bare.t.git
Cloning into bare repository 'bare.t.git'...
done.
$ cd bare.t.git
$ git config --get --bool core.bare
true

但是从检查中通常很明显:如果你的克隆说原点是ssh://some.host/some/dir/repo,你可以ssh some.hostcd /some/dir/repols,那就是“裸”克隆看起来很像非裸克隆上的.git目录的内容:

$ cd /tmp/t; ls .git
COMMIT_EDITMSG  ORIG_HEAD       description     index           objects
FETCH_HEAD      branches        gitk.cache      info            packed-refs
HEAD            config          hooks           logs            refs

VS

$ cd /tmp/bare.t.git; ls
HEAD            config          hooks           objects         refs
branches        description     info            packed-refs

(裸克隆缺少一些普通git在非裸机中工作的文件,但它们显然是相关的。)


1 有可能推向非裸回购 - 这只是一个坏主意。如果您查看自己的非裸克隆.git/config(或使用更官方的界面,git config --get receive.denyCurrentBranch),您通常会看到如下内容:

[receive]
        denyCurrentBranch = warn

此处的值可以是refusetruewarnfalseignore中的任何一个。大多数值都进行了设置,只有当推送到某个分支其他而不是“当前”分支时才会接受push。这里的问题是......好吧,假设您已登录到其他人推送的服务器上。而且,你cd /some/dir/repo并且有所有这些工作文件。 git checkout zorg非常诱人,编辑出租车司机的数量,git commit结果。但是当其他人在其他地方编辑同一个分支时会发生什么,然后在你做类似事情的过程中提交然后git push - es?如果他在你开始commit之前完成了他的推动,你就会有点混乱。通常情况下,你们两个都在服务器以外的系统上执行此操作,无论是谁先推送“胜利”而另一个人获得失败的“非快进”推送,并且知道获取和 - (合并或重组)({ {1}}或git pull或其他)。但是你已经在服务器上了,所以你不能使用正常的工作流程。事实上,首先让工作树保持最新是很困难的:你可以使用钩子来做到这一点,但是如果你有钩子git pull --rebase来更新工作树,它就会抛弃任何工作任何人都在做。 2

完全避免问题更容易:判断没有工作树,这是一个git reset --hard克隆。所有的诱惑和问题都消失了。

2 在一项工作中,我继承了一个完成该设置的设置(--bare在后​​接收挂钩中,并且每隔6小时通过git reset --hard)。它每隔几个月至少造成一次混乱。不幸的是,服务器和目录路径是很多地方的硬连线,也很难修复(这个特殊问题是低优先级)。我们只是和它一起生活。

答案 1 :(得分:3)

git fetch --dry-run --verbose可能会显示您的需求。例如:

# Before a remote update:
user@localhost:~/build/demo/myrepo$ git fetch --dry-run --verbose
From https://gitserver.local/git/myrepo
 = [up to date]      master     -> origin/master

# After a remote update:
user@localhost:~/build/demo/myrepo$ git fetch --dry-run --verbose
POST git-upload-pack (328 bytes)
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From https://gitserver.local/git/myrepo
   83619a7..67ea28b  master     -> origin/master

注意事项:

  • 退出代码不会反映您的本地仓库与远程仓库同步;它只反映了行动本身是否成功。
  • 如果您的本地仓库包含比远程仓库更新的更改,git fetch仍会认为您的本地仓库是最新的。也许git push --dry-run可以帮助解决这个问题。