2013-03-17 92 views
4

GitHub会使回购站的最新提取/获取/克隆的时间可用吗(至少对那些有回购的写入访问权限的用户)?如何从GitHub仓库中找到最新的克隆/获取/提取?

对此信息的兴趣当然来自于想要测试在回购上执行git push -f的安全性,该回购基本上会覆盖最后几个提交:如果自从发布以来没有发生拉/取/克隆最早提交到待覆盖被推到GitHub上,然后将覆盖可能是好的...


也许一个例子来阐明我的问题。为简单起见,我们假设只有一个本地分支(master)和一个远程分支(origin/master)。 (IOW,远程仓库只有一个分支,我用我们唯一的本地分支跟踪它。)

首先考虑一个完全本地的情景:我做了一个提交,并且在意识到这个问题后不久承诺。在这种情况下,我只需用覆盖了这个提交。

现在想象一下完全相同的情况,不同之处是,在注意提交问题之前,我将错误提交推送到远程(GitHub)回购。

如果我是此回购的唯一用户,那么我可以像以前一样简单地覆盖本地提交,然后使用git push -f ...覆盖远程(GitHub)回购中的错误提交。

但是,如果我不是此回购的唯一用户,则上述过程是有问题的,因为在我推送错误提交之后,某个不同用户可能已从远程(GitHub)回购库中克隆或提取,但在我覆盖远程回购中的错误提交之前。

将这种可能性降至最低的一种方法是检查从我将错误提交推送到远程回购库后执行的所有拉取,取回和克隆操作的记录。如果此记录至少显示了其中一项此类操作,那么这意味着我们正好有上一段中描述的有问题的情况。

另一方面,如果记录显示没有这样的操作,那么仍然有一些希望可以覆盖远程回购中的错误提交,而不会产生前面描述的有问题的情况。 (当然,这是一个竞争条件,所以没有100%的保证。)

但是,所有这些都是基于远程回购的这种记录提取,获取和克隆操作的可用性。我的问题是,GitHub是否能够提供这样的记录,至少对于那些具有对存储库的写入访问权限的记录是可用的。

回答

1

GitHub的V3 API不会返回,为user's repositories

... 
    "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

但是,有没有记录最新的拉,取回克隆,特别是考虑到上游回购不知道有多少下游回购存取它和什么时候。

请参阅“Definition of “downstream” and “upstream””。

GitHub可以记录这些信息:它是一个上游回购,但管理自己的基础设施和访问机制,所以是的,它可以记录上述访问。
但我不相信用户可以看到这类信息。

+0

对不起,我觉得有一个误区:我对最新推送**到***回购时间不感兴趣。我对***回购的最新* pull *,* fetch *或* clone * ***感兴趣。 – kjo 2013-03-17 19:35:05

+1

@ kjo然后否:一个[上游回购](http://stackoverflow.com/questions/2739376/definition-of-downstream-and-upstream/2749166#2749166)不知道下游回购正在做什么,在术语阅读/克隆活动.GitHub不会发布那种日志(如果它首先存在) – VonC 2013-03-17 19:43:06

+0

关于您的答案:我认为您将“上游回购”与GitHub混淆。当然,'git'没有规定跟踪谁从它那里获取/获取/克隆,但是*** GitHub ***,该网站当然也会跟踪对其页面的所有访问,并且很容易跟踪我所问的信息。我的问题是它是否做到了,并使之可用。 – kjo 2013-03-17 20:42:21

0

由于您的问题您发布的真正意图是存在:从想衡量这将是多么的安全做一个混帐推-f

..comes ...

我认为改变你的工作流程会让生活变得更容易。我建议做以下事情:

不要直接对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> 

这将有助于避免需要到--rebasemaster。这再也不应该发生。您可能想要使用更先进的技术。假设bug_fix分支需要一些时间来修复,但您也想在测试bug修复时继续开发new_idea。所以说,我们先从以下内容:

o-----o-----o    master 
     |  \ 
     |  o-----o  bug_fix 
     \ 
     o-----o   cool_idea 

所以,我们要的是对的bug_fix顶部,这样我们就可以在串联和他们合作从cool_idea应用更改。这里是你会怎么做:

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

相关问题