如果我运行 env 命令,我会得到以下输出:
TERM_PROGRAM=Apple_Terminal
GPG_AGENT_INFO=/Users/paganotti/.gnupg/S.gpg-agent:346:1
TERM=xterm-color
SHELL=/bin/bash
TMPDIR=/var/folders/BM/BMT-0W4+H5yVS5fJngFdsk+++TI/-Tmp-/
Apple_PubSub_Socket_Render=/tmp/launch-V50MvM/Render
TERM_PROGRAM_VERSION=273.1
USER=paganotti
COMMAND_MODE=unix2003
SSH_AUTH_SOCK=/tmp/launch-llkTBf/Listeners
__CF_USER_TEXT_ENCODING=0x1F5:0:0
PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/local/bin:/opt/local/sbin:/Library/Frameworks/Python.framework/Versions/3.2/bin:/Users/paganotti/Documents/Project/ZendFramework-1.11.11-minimal/bin/zf.sh:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin://usr/local/git/bin/git:/Library/Frameworks/Python.framework/Versions/3.1/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/local/ImageMagick/bin:/usr/local/MacGPG2/bin:/usr/texbin:/usr/X11/bin:/Users/paganotti/Sviluppo/android-sdk-1.5_r3/tools
PWD=/Users/paganotti
LANG=it_IT.UTF-8
SHLVL=1
HOME=/Users/paganotti
LOGNAME=paganotti
GIT_PYTHON_GIT_EXECUTABLE=/usr/local/git/bin/git
DISPLAY=/tmp/launch-aqcM4a/org.x:0
_=/usr/bin/env
Run Code Online (Sandbox Code Playgroud)
我尝试使用 python 获取 GIT_PYTHON_GIT_EXECUTABLE 变量:
GIT_PYTHON_GIT_EXECUTABLE = os.getenv('GIT_PYTHON_GIT_EXECUTABLE')
print GIT_PYTHON_GIT_EXECUTABLE
Run Code Online (Sandbox Code Playgroud)
但输出打印:
None
Run Code Online (Sandbox Code Playgroud)
因为似乎没有查看 GIT_PYTHON_GIT_EXECUTABLE 变量?怎么了?
更新
我在 pycharm 中设置了环境变量,现在它读取了该变量,但在我的实际应用程序中,我使用 pyqt 库的 QThread 类。我的应用程序构建在 pyqt 库之上,启动时它执行 Qthread。在 Qthread 中将执行 gitpython 函数。GitPython 函数启动一个子进程并尝试读取 GIT_PYTHON_GIT_EXECUTABLE,但它无法读取变量。
我是Python / Git newb,但是我正在尝试编写一个脚本,该脚本以两个分支或提交作为参数,并显示两个之间的更改文件列表,而不是常规diff附带的所有无关信息。
这是通过使用以下命令在bash脚本中完成的
git diff --name-only FIRSTBRANCH...SECONDBRANCH
Run Code Online (Sandbox Code Playgroud)
但是使用gitpython转换为Python脚本并不容易。如果有人知道如何执行此操作,那就太好了。
编辑:这是一些代码
user = str(sys.argv[1])
password = str(sys.argv[2])
currentBranch = str(sys.argv[3])
compBranch = str(sys.argv[4])
repo = Repo(directory)
currentCommit = repo.commit(currentBranch)
compCommit = repo.commit(compBranch)
diffed = repo.diff(currentBranch, compBranch)
Run Code Online (Sandbox Code Playgroud)
当我只想要更改文件列表时,print diff将返回所有diff详细信息
我正在尝试将 git 中的日志信息获取到 python 中。我查看了 pygit2 和 gitpython,但似乎都没有提供类似于 git Shortlog 的高级接口。是否有一个 python 库提供了这样的接口,或者我应该调用 git 可执行文件?
我正在编写一个 Python 脚本,我需要知道特定文件的所有提交。在我的代码中,我使用GitPython来执行其他任务,但对于这个问题我找不到任何东西。
在命令行中我使用:
git log --pretty='%H' file-path
Run Code Online (Sandbox Code Playgroud) 在下面的程序片段中,我从远程位置克隆了一个现有的存储库,它工作正常。
然后我尝试克隆一个不存在的存储库,这次调用git.Repo.clone_from()从键盘请求名称和密码。
在我的应用程序中,等待键盘输入时发生阻塞是非常不可取的,因此如果存储库不存在,我希望调用git.Repo.clone_from()来抛出异常。
有什么方法可以导致这种情况发生,或者在我尝试克隆它之前以某种方式检测现有 URL 上是否存在 git 存储库?
import git, shutil
DIRECTORY = '/tmp/clone'
def clone(url):
print(url)
shutil.rmtree(DIRECTORY, ignore_errors=True)
git.Repo.clone_from(url=url, to_path=DIRECTORY, b='master')
clone('https://github.com/ManiacalLabs/BiblioPixelAnimations.git/')
clone('https://github.com/ManiacalLabs/NONEXISTENT.git/')
Run Code Online (Sandbox Code Playgroud) 我正在编写一个Python脚本,该脚本使用GitPython(https://gitpython.readthedocs.io/en/stable/)将本地文件提交到远程存储库。对文件进行编辑后,我设置了用户名和电子邮件的值,如以下代码片段所示:
repo = git.Repo.init("my local clone path")
repo.config_writer().set_value("name", "email", "myusername").release()
repo.config_writer().set_value("name", "email", "myemail").release()
repo.git.add("filename")
repo.git.commit("filename")
repo.git.push("my remote repo url")
Run Code Online (Sandbox Code Playgroud)
我总是遇到以下错误:
stderr: '
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
Run Code Online (Sandbox Code Playgroud)
即使我已经使用config_writer()函数设置了用户名和密码,如此处所述:http ://gitpython.readthedocs.io/en/stable/tutorial.html#handling-remotes
任何有关如何解决此问题的建议将不胜感激。
有没有一种方法可以使用 GitPython 库反向迭代提交,即从最旧的到最新的,其方式类似于:
>>> from git import Repo
>>> repo = Repo('/path/to/repo')
>>> for commit in reversed(repo.iter_commits()):
... print commit
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument to reversed() must be a sequence
Run Code Online (Sandbox Code Playgroud)
不必首先将所有内容都包含在内存中,因为我的情况是处理大量提交(例如linux内核)?
在python中,我想获取git存储库中文件的所有提交的日志并解析日志中的信息(哈希、作者姓名、作者邮件、作者日期、提交者姓名、提交者邮件、提交日期和提交消息) . 目前,我可以使用 gitpython 或通过子进程调用 shell 命令来获取原始 git 日志。
使用 gitpython:
g=git.Git(path)
loginfo=g.log("--pretty=fuller",'--follow',"<filename>")
Run Code Online (Sandbox Code Playgroud)
使用子过程调用:
lines = subprocess.check_output(
['git', 'log','--follow',"--pretty=fuller","
<filename"],stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
但是,在那之后我想解析原始日志,但我无法在 gitpython 中找到合适的库/方法。此外,我还希望以 python 日期时间格式解析日期。你能帮我吗?
当我运行时git log,每次提交都会得到这一行:“作者:姓名 <电子邮件>”。如何在 Python 中为本地存储库获取完全相同的提交格式?当我运行下面的代码时,我只得到作者姓名。
from git import Repo
repo_path = 'mockito'
repo = Repo(repo_path)
commits_list = list(repo.iter_commits())
for i in range(5):
commit = commits_list[i]
print(commit.hexsha)
print(commit.author)
print(commit.committer)
Run Code Online (Sandbox Code Playgroud) 我认为 update=True 会将所有已修改、已删除和未跟踪的文件添加到索引中。我不知道方法是什么。有人可以帮我吗?
repo = Repo(working_repository_url)
repo.git.add(update=True)
repo.index.commit(my_msg)
Run Code Online (Sandbox Code Playgroud)
我是说。我当然可以得到:
untracked_items = repo.untracked_files
Run Code Online (Sandbox Code Playgroud)
这仅适用于未跟踪的文件。我想将未跟踪的文件、删除的、修改的文件添加到索引中,然后对所有文件进行提交。
我更有可能正在寻找相当于git add --all