Git为每次推送提交
是否有方法检索最新推送的提交列表?例如,假设我正在进行10次本地提交,但只有一次推送,是否有git命令只显示这10次提交 您可以使用下面的命令检查提交历史记录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/
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
- 参考文献
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'))