11

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

我可以使用 Gitstatus命令检查本地存储库中未跟踪/未暂存的文件。我如何对远程存储库做同样的事情?

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

4

3 回答 3

8

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对这种情况有所帮助。
于 2015-03-19T09:58:53.203 回答
6

如果你有一个 Git 远程仓库,你可以git push通过 SSH 访问它,它通常应该是一个仓库--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.hostandcd /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

这里的值可以是refusetruewarnfalse或中的任何一个ignore。大多数值都设置push为仅在推送到“当前”分支以外的某个分支时才被接受。

这里的问题是......好吧,假设您登录到其他人推送的服务器上。你瞧,你cd /some/dir/repo还有所有这些工作文件。

git checkout zorg编辑出租车司机的数量和结果非常诱人git commit。但是,当其他人在其他地方编辑同一个分支,并git push在你中间提交然后 -es 做类似的事情时会发生什么?

如果他/她在你开始之前完成了他/她的推动,那么你commit就会一团糟。通常,你们俩都在服务器以外的系统上执行此操作,并且首先推送的人“获胜”,而另一个人获得失败的“非快进”推送并且知道获取和(合并或变基)(git pullgit pull --rebase管他呢)。

但是你已经在服务器上,所以你不能使用正常的工作流程。事实上,首先要让工作树保持最新是很困难的:你可以用钩子来做到这一点,但是如果你有git reset --hard更新工作树的钩子,它就会丢弃任何人正在做的任何工作。2

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

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

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

于 2013-09-21T19:33:45.213 回答
0

这可能不是您正在寻找的内容,但我到这里询问了 Google 的类似问题。我想知道的是“相对于我的本地主人,我的遥控器目前在哪里。

 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

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

于 2021-11-10T02:54:59.257 回答