可能是我误解了如何解决这个问题,而我刚刚发现gitpython与专家相反。
我尝试使用linux上的git客户端手动提交/推送repo。但我想要一个预提交钩子来编辑每个git commit
上的文件,并在推送任何内容之前将该文件添加回相同的提交。
sha_last_run = get_previous() # calling a CD pipeline api
repo = git.Repo(search_parent_directories=True)
new_sha_to_run = repo.head.object.hexsha[:7]
with fileinput.FileInput("file.yml", inplace=True, backup=".bak") as f:
for line in f:
print(line.replace(sha_last_run, new_sha_to_run), end="")
repo.git.add(update=True)
我正在更换'版本'或者' last_sha_run'在file.yml
中,我即将推出。基本上它用新sha替换旧的sha然后分段文件但是我不想要那个,因为我最终总是把这个文件上演并且需要被推荐。
有没有更简单的方法可以将修改后的文件添加到同一个sha 然后使用挂钩提交sha?
----额外信息----
我想说清楚到目前为止:
如果我的管道在提交/合并上运行,则掌握abc123。然后我的file.yml中的版本 - 应用程序:版本是app:acb123。
预提交钩子是找到abc123(来自管道api last_run_sha)和可能被推送到分支的本地提交。
我希望预提交挂钩做的是自动更新file.yml中的这个版本abc123,其中包括编辑从钩子跟踪并使它成为触发钩子的git commit
的一部分
所以工作流程就像这样:
touch some_file && git add -u
git commit -m "I just added some file"
这是一个更复杂的工作体系的一部分,并且很高兴(在这一点上必不可少的代码)。
我已经制定的场景中的上述代码正在运作...... ish。唯一的问题是它正在取代" last_sha_run"在file.yml中使用 second 来提交而不是我可以推送的当前提交。
所以如果我的file.yml app:version是app:abc123
我完成了
我可以推123123,但我的file.yml文件正在阅读app:cba123
我落后了,也许这是我的错误。我只想捕获当前提交sha。
我想知道我的上述解决方案是否正常工作但是我的钩子运行后生成的新提交是否正在生成,基本上是当前的sha,并将其放置到位?但我还是落后......
这正是发生的事情。注释掉编辑文件的钩子中的部分,并且打印repo.commit()会看到当前的提交而不是正在创建的提交。我不知道这是否已经生成,或者如果有一个展望未来我可以使用head.object。
但是除了提交后的脚本之外,我还不确定如何使这种方法有效。但是我觉得我有同样的问题。
答案 0 :(得分:0)
没有办法修改" sha"因为修改后的提交必须具有不同的SHA-1 ID。
强制用户添加文件的唯一方法是预提交挂钩,拒绝没有文件的提交。
答案 1 :(得分:0)
使用git archive HEAD | tar Cx /path/to/deployment
而不是使用checkout进行部署,部署的内容将具有您想要的内容,以及您想要的任何替换。
echo '$Format:Generated from commit %H made %cd by %aN$' >meta.txt
echo meta.txt export-subst >>.gitattributes
git add meta.txt .gitattributes
git commit -mdemo
git archive HEAD | tar xO meta.txt # or | tar Cx ../deploy; cat ../deploy/meta.txt