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

  • 本文关键字:状态 存储 Git 何检查 git
  • 更新时间 :
  • 英文 :


我有一个远程 Git 存储库,我可以通过 SSH 从本地存储库推送/拉取到它。

我可以使用 Git status 命令检查本地存储库中未跟踪/未暂存的文件。如何对远程存储库执行相同的操作?

请注意,我不是在查找本地提交和远程提交之间的差异。

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对这种情况有所帮助。

如果你有一个 Git 远程仓库,你可以通过 SSH git push,它通常应该是一个--bare仓库(请参阅在线 Git 书中关于在服务器上设置裸仓库的说明)。裸存储库没有任何地方可以对其进行任何工作。这意味着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

与:

$ 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之前完成他/她的推动,你就有点乱了。通常,你们俩都在服务器以外的系统上执行此操作,谁先推送"获胜",另一个人获得失败的"非快进"推送,并且知道获取和(合并或变基)(git pullgit pull --rebase或其他什么)。

但是您已经在服务器上,因此无法使用正常的工作流程。事实上,首先很难使工作树保持最新:你可以用钩子来做到这一点,但是如果你有钩子git reset --hard来更新工作树,它会丢弃任何人正在做的任何工作。阿拉伯数字

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

2在一份工作中,我继承了一个这样做的设置(git reset --hard在接收后钩子中,并且通过 cron 每隔六小时一次)。它至少每隔几个月引起一次混乱。不幸的是,服务器和目录路径在很多地方都是硬连线的,因此也很难修复(而且这个特定问题是低优先级的)。我们只是忍受着它。

(按照评论中的要求,这是"答案"形式的两条评论。我已经扩展了它们,因为这里有更多的空间。

这可能不完全是你要找的,但我在这里问了谷歌类似的问题。我想知道的是"相对于我当地的主人,我的遥控器目前在哪里。

 git log

是我需要的。

commit 7bf74892162713b87a19c6194c8041c9bbf96552 (HEAD -> master, origin/master)
Author: Andy Reilly <andy@blah.com>
Date:   Tue Nov 9 18:46:16 2021 -0800
fixed data validation lock on condition column in upload spreadsheet
commit 8462456d5fe6bcc11acbf89bca949f15faef0424 (training-db/master)
Author: Andy Reilly <andy@blah.com>
Date:   Mon Nov 8 12:28:02 2021 -0800
added todo for future setup
commit 1cf4a93d419c4ccc1d1f5ac9203edd2b9cefafa4
Author: Andy Reilly <andy@blah.com>
Date:   Mon Nov 8 11:15:56 2021 -0800
added uniqueness to tenant for category names so accidental rerun of initial setup does not create duplicates
commit 28f2d5a2c4ca869ebdb086696c97554587592e27 (multi-tenant/master)
Author: Andy Reilly <andy@blah.com>
Date:   Sat Nov 6 18:32:09 2021 -0700

所以知道我知道我的训练服务器落后一个提交,我的生产服务器落后两个提交。

最新更新