Git¶
该 Git
帮助程序是 git
命令的精简包装器。它可用于多种目的:- 在 set_version()
方法中获取当前标签,并将其分配给 self.version
- 在第三方或开源包配方中的 source()
方法中克隆源代码(通常,首选执行 download()
或 get()
以获取发行版 tarball)- 在 export()
方法中捕获您自己的包源的“scm”坐标(url、commit),以便能够稍后从源代码重新生成构建,并在 source()
方法中检索代码。请参阅 git-scm 捕获示例。
该 Git()
构造函数接收当前文件夹作为参数,但如果需要,可以更改此参数,例如,在 source()
中克隆某些存储库的源代码。
def source(self):
git = Git(self) # by default, the current folder "."
git.clone(url="<repourl>", target="target") # git clone url target
# we need to cd directory for next command "checkout" to work
git.folder = "target" # cd target
git.checkout(commit="<commit>") # git checkout commit
另一种等效的方法是
def source(self):
git = Git(self, "target")
# Cloning in current dir, not a children folder
git.clone(url="<repourl>", target=".")
git.checkout(commit="<commit>")
- class Git(conanfile, folder='.', excluded=None)¶
Git 是用于 git 工具的几种常用模式的包装器。
- 参数:
conanfile – Conanfile 实例。
folder – 当前目录,默认为
.
,即当前工作目录。excluded – 要从“脏”检查中排除的文件。它将与配置
core.scm:excluded
组合(配置具有更高的优先级)。它是一个用于fnmatch
的模式列表。
- run(cmd, hidden_output=None)¶
执行
git <cmd>
- 返回值:
命令的控制台输出。
- get_commit(repository=False)¶
- 参数:
repository – 默认情况下获取定义文件夹的提交,使用 repo=True 获取存储库的提交。
- 返回值:
当前提交,使用
git rev-list HEAD -n 1 -- <folder>
。返回最新的提交,而不管本地未提交的更改。
- get_remote_url(remote='origin')¶
使用
git remote -v
获取远程 git 远程存储库的 URL。警告! 请注意,此方法将获取
git remote -v
的输出。如果您在 URL 中的远程中添加了令牌或凭据,它们将被公开。不应将凭据添加到 git 远程定义中,而应使用凭据管理器或类似机制。如果您仍然想使用此方法,则您有责任从结果中删除凭据。- 参数:
remote – 远程 git 存储库的名称(默认为“origin”)。
- 返回值:
远程 git 远程存储库的 URL。
- commit_in_remote(commit, remote='origin')¶
检查给定的提交是否存在于远程中,使用
branch -r --contains <commit>
并检查该远程中是否存在分支。- 参数:
commit – 要检查的提交。
remote – 远程 git 存储库的名称(默认为“origin”)。
- 返回值:
如果给定的提交存在于远程中,则返回 True,否则返回 False。
- is_dirty(repository=False)¶
返回当前文件夹是否为脏状态,运行
git status -s
。该Git(..., excluded=[])
参数和core.scm:excluded
配置将定义要从此检查中跳过的文件模式。- 参数:
repository – 默认情况下检查当前文件夹是否为脏状态。如果 repository=True,它将检查根存储库文件夹,而不是当前文件夹。
- 返回值:
如果当前文件夹为脏状态,则返回 True,否则返回 False。
- get_url_and_commit(remote='origin', repository=False)¶
这是一个高级方法,它返回当前提交和远程存储库 URL。此方法旨在捕获包创建的当前远程坐标,以便稍后可以从相同的提交中再次从源代码构建。这是行为
如果存储库为脏状态,它将引发异常。捕获脏内容的坐标没有意义,因为它不可重现。如果存在本地更改,并且用户希望测试本地 conan create,则应首先提交更改(在本地,而不是推送更改)。
如果存储库不为脏状态,但提交在给定的远程中不存在,则该方法将返回该提交和本地用户检出的 URL。这样,可以在本地创建包,测试一切正常,然后再将一些更改推送到远程。
如果存储库不为脏状态,并且提交存在于指定的远程中,它将返回该提交和远程的 URL。
警告! 请注意,此方法将获取
git remote -v
的输出。如果您在 URL 中的远程中添加了令牌或凭据,它们将被公开。不应将凭据添加到 git 远程定义中,而应使用凭据管理器或类似机制。如果您仍然想使用此方法,则您有责任从结果中删除凭据。- 参数:
remote – 远程 git 存储库的名称(默认为“origin”)。
repository – 默认情况下获取定义文件夹的提交,使用 repo=True 获取存储库的提交。
- 返回值:
(url、commit) 元组
- get_repo_root()¶
使用
git rev-parse --show-toplevel
获取当前存储库的顶级文件夹。- 返回值:
存储库顶级文件夹。
- clone(url, target='', args=None, hide_url=True)¶
执行
git clone <url> <args> <target>
操作,其中 target 是目标目录。- 参数:
url – 远程存储库的 URL。
target – 目标文件夹。
args – 要作为列表传递给 git clone 的额外参数。
hide_url – 从日志输出中隐藏 URL 以防止意外泄露凭据。可以通过传递
False
来禁用。
- fetch_commit(url, commit, hide_url=True)¶
实验性:执行单个提交获取和检出,而不是完整克隆,速度应该更快。
- 参数:
url – 远程存储库的 URL。
commit – 要检出的提交 ref。
hide_url – 从日志输出中隐藏 URL 以防止意外泄露凭据。可以通过传递
False
来禁用。
- checkout(commit)¶
使用
git checkout <commit>
检出给定的提交。- 参数:
commit – 要检出的提交。
- included_files()¶
- 运行
git ls-files --full-name --others --cached --exclude-standard
以获取列表 未被
.gitignore
忽略的文件。
- 返回值:
文件列表。
- 运行
- coordinates_to_conandata()¶
从 Git 仓库中捕获“url”和“commit”,调用
get_url_and_commit()
,然后将这些信息存储在conandata.yml
的“scm”键下。此信息可用于稍后克隆并检出用于创建此包的确切源代码点,即使配方使用exports_sources
作为嵌入源代码的机制,此信息也可能很有用。
- checkout_from_conandata_coordinates()¶
读取
conandata.yml
中的“scm”字段,该字段必须至少包含“url”和“commit”,然后执行clone(url, target=".")
,然后执行checkout(commit)
。