[英]How do find out latest clone/fetch/pull from a GitHub repo?
GitHub是否可以使repo的最新pull / fetch / clone可用(至少对那些对repo有写访问权限的人)?
当然,对这些信息的兴趣来自于想要评估在repo上执行git push -f
安全性,这将基本上覆盖最后几次提交:如果最早没有发生pull / fetch / clone提交被覆盖被推送到GitHub,然后覆盖可能没问题......
也许一个例子将澄清我的问题。 为简单起见,我们假设只有一个本地分支( master
)和一个远程分支( origin/master
)。 (IOW,远程仓库只有一个分支,我用我们唯一的本地分支跟踪它。)
首先考虑一个完全本地的场景:我做了一个提交,不久之后意识到这个提交有问题。 在这种情况下,我只使用git commit --amend ...
覆盖正确的git commit --amend ...
。
现在想象完全相同的场景,区别在于,在注意到提交问题之前,我将错误提交推送到远程(GitHub)repo。
如果我是这个repo的唯一用户,那么我可以像以前一样在本地覆盖提交,然后使用git push -f ...
来覆盖远程(GitHub)repo中的错误提交。
但是,如果我不是这个repo的唯一用户,那么上面的过程是有问题的,因为在推送错误的提交之后的某个时刻,在我覆盖之前,不同的用户可以从远程(GitHub)repo克隆或获取远程仓库中的错误提交。
最小化这种可能性的一种方法是检查自从我将错误提交推送到远程仓库以来在远程仓库上执行的所有pull,fetch和clone操作的记录。 如果此记录至少显示其中一个此类操作,那么这意味着我们确实存在前一段中描述的有问题的情况。
另一方面,如果记录显示没有这样的操作,那么仍然有一些希望我可以覆盖远程仓库中的错误提交而不会引起前面描述的有问题的情况。 (当然,这是竞争条件,所以没有100%保证。)
然而,所有这些都取决于远程仓库上的拉,取和克隆操作记录的可用性。 我怀疑GitHub是否提供了这样的记录,至少对那些具有对repo的写访问权限的人来说是这样。
对于用户的存储库 ,GitHub V3 API确实返回:
...
"pushed_at": "2011-01-26T19:06:43Z",
"created_at": "2011-01-26T19:01:12Z",
"updated_at": "2011-01-26T19:14:43Z"
}
“ pushed_at
”字段可能是上次提交的时间,但不一定是您要push --force
的分支上的最后一次提交push --force
。
然而, 没有记录最新的拉取,克隆 ,特别是考虑到上游回购不知道有多少下游回购正在访问它以及何时访问它。
参见“ 下游”和“上游”的定义 。
GitHub可以记录这些信息:它是一个上游仓库,但管理自己的基础设施和访问机制,所以是的,它可以记录所述访问。
但我不相信用户可以看到那种信息。
因为在您的问题中,您发布的真实意图是:
..想要衡量一下git push -f的安全性...
我认为改变工作流程会让生活变得更轻松。 我建议做以下事情:
不要直接向master
提交非平凡的更改(基本上您可能希望稍后更改)。 一旦改变已经master
在master
它就永远不会被触及。 这是一个例子:
# assuming starting on master branch
git checkout -b new_cool_idea
# commit a few things
git push origin new_cool_idea
# realize there was a bug preventing you from finishing the
# implementation of new_cool_idea
git checkout -b cool_idea_bug_fix master
# commit the bug fix
# if you have any reviewers, push to remote
git push origin cool_idea_bug_fix
# when bug fix is all good, cleanup and finish new_cool_idea
git checkout master
git merge cool_idea_bug_fix
git branch -d cool_idea_bug_fix
git push origin :cool_idea_bug_fix
git checkout new_cool_idea
git rebase master
# may possibly have conflicts, go ahead and resolve
# now finish implementing new_cool_idea
# if you only want to update one remote branch add <remote> <branch>
# otherwise all remotes will be updated
git push -f <remote> <branch>
这应该有助于防止需要--rebase
on master
。 这也不应该发生。 您可能希望使用更先进的技术。 假设bug_fix
分支需要一些时间来修复,但您还需要在测试错误修复时继续开发new_idea
。 所以说我们从以下开始:
o-----o-----o master
| \
| o-----o bug_fix
\
o-----o cool_idea
所以,我们要的是从应用更改cool_idea
之上bug_fix
,所以我们可以在串联和他们合作。 这是你如何做到这一点:
git checkout cool_idea
git rebase --onto bug_fix master cool_idea
然后你的历史将如下所示:
o-----o-----o master
\
o-----o bug_fix
\
o-----o cool_idea
如果您真的考虑使用此方法,那么如果您需要添加提交或--rebase
分支bug_fix
我将编写清理步骤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.