Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git为每次推送提交_Git_Git Bash - Fatal编程技术网

Git为每次推送提交

Git为每次推送提交,git,git-bash,Git,Git Bash,是否有方法检索最新推送的提交列表?例如,假设我正在进行10次本地提交,但只有一次推送,是否有git命令只显示这10次提交 您可以使用下面的命令检查提交历史记录 git log 你说 我正在做10次本地提交 那么让我们假设你做了其中一个 git clone whatever git pull 就在你之前 # edit stuff git commit -a # repeat 9 more times 然后 git push 现在您可以通过命令看到这10个提交 git log origin/

是否有方法检索最新推送的提交列表?例如,假设我正在进行10次本地提交,但只有一次推送,是否有git命令只显示这10次提交

您可以使用下面的命令检查提交历史记录

git log
你说

我正在做10次本地提交

那么让我们假设你做了其中一个

git clone whatever
git pull
就在你之前

# edit stuff
git commit -a
# repeat 9 more times
然后

git push
现在您可以通过命令看到这10个提交

git log origin/master@{1}..origin/master
但如果你这么做了

git fetch

在两次提交之间的任何时候,您都破坏了您开始本地工作时
origin/master
所在位置的重新记录。您必须记住
origin/master
git fetch
更改的频率,并将
{1}
调整为
{2}
(它计算您想要返回的更新次数,而不是修订次数)。

简单的回答是,您无法可靠地执行所需操作:git本身不记录
git push
操作。但有些事情你可以做。具体地说,在Git执行
Git推送
或在Git接收
Git推送
时,推送本身,您可以获得此信息。如何保存、处理和以后使用它取决于您

(我还认为这不是一个好主意:不要尝试按推式分组,而是以其他方式分组。例如,在CI系统中,按请求分组,请求将动态更新。如果生成请求#30将提交a、B和C作为“自创建请求以来的新提交”由于上一次推送,五秒钟过去了,但现在有a、B和D。对a-B-D进行CI检查,而不是a-B-C中的一个,然后是remove-C-add-D中的一个。通读此答案的其余部分以了解此处发生的情况。)

预推钩 发送提交的Git将运行预推钩子(如果存在)。发送Git上的pre-push钩子每个,嗯,我们暂时称之为“per-thingy”获得四个信息项:

  • 本地参考
  • 本地OID/SHA-1/哈希
  • 远程参考
  • 远程OID/SHA-1/哈希
假设你做到了:

git push origin refs/heads/master:refs/tags/v1.1
因此,本地ref是
refs/heads/master
。散列ID现在是SHA-1散列,但Git的内部现在称为“OID”(意思是对象ID),以便将来在Git切换到SHA-256时进行校对,但您可以将其称为“散列”,以避免TLA综合症1是您的
refs/heads/master
标识的任何提交散列ID。远程ref将是
refs/tags/v1.1
,远程散列可能是全零,因为这可能是您想要创建的一个新的轻量级标记

如果您改为跑步:

git push origin master develop
你的钩子会有两样东西。一个会提到
refs/heads/master
两次,另一个会提到
refs/heads/develope
两次:本地和远程
master
分支,以及本地和远程
develope
分支,您正在推进一个大型
git push
操作。散列ID将是本地
主机
及其
主机
的散列ID,本地
开发
及其
开发
的散列ID

使用这些散列ID,您可以看到哪些提交对它们来说是新的。如果他们的散列ID在您的Git存储库中,您还可以看到您是否要求他们删除任何提交,或者更准确地说,使他们无法访问。有关可达性的更多信息,请参阅

其中一些散列ID可能全为零。这样的散列ID意味着“没有这样的名称”。对于
git push
,如果您要求他们的git删除引用,则远程哈希值将全部为零。如果您没有引用,则本地哈希值将全部为零(只有当您要求它们也删除时,这才有意义)


1TLA代表三个字母的首字母缩写。与ETLA相比,ETLA是一个具有三个以上字母的扩展TLA


预接收、更新和后接收挂钩 接收提交并被要求更新其引用的Git将运行预接收钩子和后接收钩子(如果存在)。这些将得到和更新请求一样多的“东西”。它还将运行更新挂钩(如果存在的话),每件事运行一次

pre-receive钩子为每件事物获取三个信息项:

  • 当前(旧)OID/哈希
  • 建议的新OID/hash
  • 参考文献
当前哈希告诉您当前名称代表什么。例如,在我们的标记创建示例中,当前哈希值将全部为零。建议的新散列是推送Git要求您(接收Git)用作更新引用的新散列ID的对象ID。参考当然是要更新的参考

在我们的两个要更新的分支示例中,
refs/heads/master
的两个哈希将是当前的
master
commit和建议的新
master
commit。它们都可能是有效的散列,而不是全零,但最多一个可以是全零。如果您,即接收Git,还没有引用(即分支
master
对您来说都是新的),则旧哈希值都是零;如果请求接收Git删除引用,则新哈希值都为零

预推钩子的工作是通读所有建议的更新,并验证这是否正常。如果是这样,预推钩子应该退出0(shell退出状态为true)。如果没有,预推钩子可以打印输出,通知运行
git push的用户拒绝推送的原因,用户将看到此输出,其前面有单词
remote:
,然后退出非零,以拒绝整个推送

在pre-receive钩子运行时,接收Git可以访问所有提议的对象。也就是说,如果推送的家伙运行了git-push-origin-master-develope,这意味着发送三个新的git rev-list $old..$new
git rev-list $new..$old
git rev-list $old...$new
...--o--*   <-- master
...--o--*--A--B--C   <-- master
...--o--*---------M   <-- master
         \       /
          A--B--C
import json
import requests

def checkAsset(obj):
    status=0
    #status=0 modified, status=1 new file, status=2 deleted
    if (obj['new_path']==obj['old_path'] and obj['new_file']==False):
        status=0
    elif (obj['new_path']==obj['old_path'] and obj['new_file']==True):
        status=1
    elif (obj['new_path']==obj['old_path'] and obj['deleted_file']==True):
        status=2
    else:
        status=0
    return status


headers = {'Private-Token': 'XXXXXXXXXXXXXX'}
#this API gives you all commits grouped by pushes
pushes= "https://gitlab.XXXXX/api/v4/projects/{{projectID}}/events??target_type=issue&action=pushed"

r = requests.get(pushes, headers=headers)

latestPushes=json.loads(r.content)

lastPush=latestPushes[0]
i=0
while lastPush['push_data']['ref']!= 'master':
    i+=1
    lastPush=latestPushes[i]

commitNumber=lastPush['push_data']['commit_count']
if (commitNumber > 30):
    raise Exception("Could not compare, too many commits in one push")
initCommit=lastPush['push_data']['commit_from']
latestCommit=lastPush['push_data']['commit_to']

compareApi= "https://gitlab.XXXXXXXXXXX/api/v4/projects/{{projectID}}/repository/compare?from="+str(initCommit)+"&to="+str(latestCommit)

r = requests.get(compareApi, headers=headers)

compareJson=json.loads(r.content)

diffs=compareJson['diffs']

Mlist=[]
Alist=[]
Dlist=[]
for asset in diffs:
        status=checkAsset(asset)
        if status==0:
            Mlist.append(asset['new_path'].encode('ascii','ignore'))
        elif status==1:
            Alist.append(asset['new_path'].encode('ascii','ignore'))
        else:
            Dlist.append(asset['new_path'].encode('ascii','ignore'))