执行Git命令,而无需进入存储库并输出当前目录

时间:2018-11-19 11:19:34

标签: python git github

我正在编写一个Python脚本来循环遍历某个文件夹中的所有Git存储库。现在,我想在git-log结果中包括当前文件夹名称,但在git-log documentation中找不到如何执行此操作的方法。

如果您对某个存储库执行Git命令而不进入该存储库,是否可以打印出当前目录?

我当前的git-log命令如下:

git -C ./%s log --pretty=format:-C,\'"%%H","%%s"\' | grep -E %s >> output.csv

我知道我可以同时使用git --git-dir=repo/.git loggit -C /repo log在子文件夹中执行命令。

我也尝试使用$(basename "$PWD"),但是它显示了当前文件夹,但没有显示子文件夹。

关于如何执行此操作的任何想法?

2 个答案:

答案 0 :(得分:3)

根据我对您的问题的了解,您想在git log的每一行中添加当前的git repo名称。

自从标记了Python之后,这可能会很困难,但是您可以使用GitPython来确定文件夹内的子文件夹是否是git存储库。然后,您可以使用subprocess.Popen()打开git log命令,并从stdout中打印出带有存储库名称的每一行。

在运行此代码之前,请确保先pip install GitPython

这里是一个例子:

from os import listdir
from os import chdir
from os import getcwd

from os.path import abspath

from git import Repo
from git import InvalidGitRepositoryError

from subprocess import Popen
from subprocess import PIPE

# Current working directory with all git repositories
# You can change this path to your liking
ROOT_PATH = getcwd()

# Go over each file in current working directory
for file in listdir(ROOT_PATH):
    full_path = abspath(file)

    # Check if file is a git repository
    try:
        Repo(full_path)

        # Change to directory
        chdir(full_path)

        # Run git log command
        with Popen(
            args=['git', 'log', '--pretty=format:"%h - %an, %ar : %s"'],
            shell=False,
            stdout=PIPE,
            bufsize=1,
            universal_newlines=True,
        ) as process:

            # Print out each line from stdout with repo name
            for line in process.stdout:
                print('%s %s' % (file, line.strip()))

        # Change back to path
        chdir(ROOT_PATH)

    # If we hit here, file is not a git repository
    except InvalidGitRepositoryError:
        continue

当我在包含所有git存储库的文件夹中运行脚本时,这对我有用。

注意:可能有一种更好的方法是使用git命令本身或bash来完成此操作。

答案 1 :(得分:0)

如果您正在寻找快速的GNU findutils + GNU Bash解决方案,那就别无所求:

find -type d -name '*.git' -execdir bash -c 'cd $0; cd ..; git --no-pager log --pretty=format:"${PWD##*/},%H,%s"' {} \;