我有一个远程Git存储库,我可以通过SSH从本地存储库中推送/拉出。我可以使用Git status
命令检查本地仓库中未跟踪/未分页的文件。如何使用远程仓库执行相同的操作?请注意,我不是在寻找本地提交和远程提交之间的区别。
答案 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.host
和cd /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
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
此处的值可以是refuse
,true
,warn
,false
或ignore
中的任何一个。大多数值都进行了设置,只有当推送到某个分支其他而不是“当前”分支时才会接受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 push --dry-run
可以帮助解决这个问题。