Выполните команду Git, не находясь в хранилище и не выводя текущий каталог - PullRequest
0 голосов
/ 19 ноября 2018

Я пишу скрипт на Python, чтобы перебрать все Git-репозитории в определенной папке. Теперь я хочу включить имя текущей папки в результат git-log, но не могу найти способ сделать это в документации git-log .

Есть ли способ распечатать текущий каталог, если вы выполняете команды Git для хранилища, не находясь в этом хранилище?

Моя текущая команда git-log выглядит так:

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

Я знаю, что могу использовать как git --git-dir=repo/.git log, так и git -C /repo log для выполнения команд в подпапках.

Я также пытался использовать $(basename "$PWD"), но он показывает текущую папку, но не подпапки.

Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Если вы ищете быстрое решение GNU findutils + GNU Bash, не ищите дальше:

find -type d -name '*.git' -execdir bash -c 'cd $0; cd ..; git --no-pager log --pretty=format:"${PWD##*/},%H,%s"' {} \;
0 голосов
/ 19 ноября 2018

Насколько я понимаю из вашего вопроса, вы хотите добавить текущее имя git-репо с каждой строкой из git log.

Поскольку вы пометили Python, это может быть длинным шагом, но вы можете использовать GitPython , чтобы определить, являются ли подпапки внутри папки репозиториями git. Затем вы можете открыть команду git log с помощью subprocess.Popen() и распечатать каждую строку с именем репозитория из 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...