我有一个远程 Git 存储库,我可以通过 SSH 从本地存储库推/拉到该存储库。
我可以使用 Gitstatus
命令检查本地存储库中未跟踪/未暂存的文件。我如何对远程存储库做同样的事情?
请注意,我不是在寻找本地提交和远程提交之间的差异。
我有一个远程 Git 存储库,我可以通过 SSH 从本地存储库推/拉到该存储库。
我可以使用 Gitstatus
命令检查本地存储库中未跟踪/未暂存的文件。我如何对远程存储库做同样的事情?
请注意,我不是在寻找本地提交和远程提交之间的差异。
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 push --dry-run
对这种情况有所帮助。如果你有一个 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.host
andcd /some/dir/repo
和ls
,则“裸”克隆看起来很像.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
这里的值可以是refuse
、true
、warn
、false
或中的任何一个ignore
。大多数值都设置push
为仅在推送到“当前”分支以外的某个分支时才被接受。
这里的问题是......好吧,假设您登录到其他人推送的服务器上。你瞧,你cd /some/dir/repo
还有所有这些工作文件。
git checkout zorg
编辑出租车司机的数量和结果非常诱人git commit
。但是,当其他人在其他地方编辑同一个分支,并git push
在你中间提交然后 -es 做类似的事情时会发生什么?
如果他/她在你开始之前完成了他/她的推动,那么你commit
就会一团糟。通常,你们俩都在服务器以外的系统上执行此操作,并且首先推送的人“获胜”,而另一个人获得失败的“非快进”推送并且知道获取和(合并或变基)(git pull
或git pull --rebase
管他呢)。
但是你已经在服务器上,所以你不能使用正常的工作流程。事实上,首先要让工作树保持最新是很困难的:你可以用钩子来做到这一点,但是如果你有git reset --hard
更新工作树的钩子,它就会丢弃任何人正在做的任何工作。2
完全避免这个问题更容易:下令没有工作树,这是一个--bare
克隆。所有的诱惑和问题都消失了。
2在一项工作中,我继承了一个可以做到这一点的设置(git reset --hard
在接收后挂钩中,并且每隔六小时通过cron
)。它至少每隔几个月就会引起很多混乱。不幸的是,服务器和目录路径在很多地方都是硬连接的,因此也很难修复(而且这个特殊问题的优先级很低)。我们只是忍受它。
(根据评论中的要求,这是“答案”形式的两条评论。我已经扩展了它们,因为这里有更多空间。)
这可能不是您正在寻找的内容,但我到这里询问了 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
所以知道我知道我的训练服务器落后了一个提交,而我的生产服务器落后了两个提交。