2

カスタム日付のファイルをコミットしたいのですが。

これまでにCommitオブジェクトを作成しましたが、それをリポジトリにバインドする方法がわかりません。

from git import *
repo = Repo('path/to/repo')
comm = Commit(repo=repo, binsha=repo.head.commit.binsha, tree=repo.index.write_tree(), message='Test Message', committed_date=1357020000)

ありがとう!

4

4 に答える 4

4

さて私は解決策を見つけました。

私は気づいていませんでしたが、すべてのパラメーターを提供する必要がありました。そうしないと、コミットオブジェクトがシリアル化しようとしたときにBadObject例外がスローされていました。

from git import *
from time import (time, altzone)
import datetime
from cStringIO import StringIO
from gitdb import IStream

repo = Repo('path/to/repo')

message = 'Commit message'

tree = repo.index.write_tree()
parents = [ repo.head.commit ]

# Committer and Author
cr = repo.config_reader()
committer = Actor.committer(cr)
author = Actor.author(cr)

# Custom Date
time = int(datetime.date(2013, 1, 1).strftime('%s'))
offset = altzone
author_time, author_offset = time, offset
committer_time, committer_offset = time, offset

# UTF-8 Default
conf_encoding = 'UTF-8'

comm = Commit(repo, Commit.NULL_BIN_SHA, tree, 
      author, author_time, author_offset, 
      committer, committer_time, committer_offset,
      message, parents, conf_encoding)

コミットオブジェクトを作成した後、適切なSHAを配置する必要がありました。これがどのように行われたかはわかりませんでしたが、GitPythonソースコードの内臓を少し調べただけで答えが得られました。

stream = StringIO()
new_commit._serialize(stream)
streamlen = stream.tell()
stream.seek(0)

istream = repo.odb.store(IStream(Commit.type, streamlen, stream))
new_commit.binsha = istream.binsha

次に、コミットをHEADコミットとして設定します

repo.head.set_commit(new_commit, logmsg="commit: %s" % message)
于 2013-01-17T23:31:31.257 に答える
3

コミットオブジェクトを手動で作成する必要がない、より単純なソリューション(ファイルも追加したい場合は、新しいインデックスを手動で作成することもできます)。

from git import Repo, Actor # GitPython
import git.exc as GitExceptions # GitPython
import os # Python Core


# Example values
respository_directory = "."
new_file_path = "MyNewFile"
action_date = str(datetime.date(2013, 1, 1))
message = "I am a commit log! See commit log run. Run! Commit log! Run!"
actor = Actor("Bob", "Bob@McTesterson.dev" )

# Open repository
try:
    repo = Repo(respository_directory)
except GitExceptions.InvalidGitRepositoryError:
    print "Error: %s isn't a git repo" % respository_directory
    sys.exit(5)

# Set some environment variables, the repo.index commit function
# pays attention to these.
os.environ["GIT_AUTHOR_DATE"] = action_date
os.environ["GIT_COMMITTER_DATE"] = action_date

# Add your new file/s
repo.index.add([new_file_path])

# Do the commit thing.
repo.index.commit(message, author=actor, committer=actor)
于 2015-02-17T13:34:43.050 に答える
1

また、コミットの目的で指定された日時を使用しています。私の場合、長い調査の結果datetime、GitPythonが提案しているように、実際にはISO形式ではなく、timestamp形式でも指定する必要があることがわかりました。それは、標準のpython形式であるはずの独自の「解析」のために、実際には妄想を引き起こしています。

いいえ。git自体が理解できる形式で指定する必要があります。

例えば:

# commit_date is your specified date in datetime format
commit_date_as_text = commit_date.strftime('%Y-%m-%d %H:%M:%S %z')
git_repository.index.commit(commit_message, author=commit_author, commit_date=commit_date_as_text)

たとえば、 StackOverflowの別のトピックで見つけることができる受け入れられた形式のリスト。

于 2020-06-18T08:56:50.620 に答える
1

commit_dateコミット時に設定できます。

r.index.commit(
    "Initial Commit",
    commit_date=datetime.date(2020, 7, 21).strftime('%Y-%m-%d %H:%M:%S')
)
于 2020-07-21T07:46:51.117 に答える