ФорумПрограммированиеPython → python и работа с git

python и работа с git

  • polin11

    Сообщения: 41 Репутация: N Группа: Кто попало

    Spritz 12 июля 2018 г. 0:06

    Вроде бы простая задача - написать скрипт, который, выдаст автора ветки в удаленном репозитории в git'е.
    Какая питоновская библиотека подойдет для этого лучше? Если кто-то заморачивался такой же задачей и у него есть результат, прошу поделиться наработками.

  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо
  • polin11

    Сообщения: 41 Репутация: N Группа: Кто попало

    Spritz 12 июля 2018 г. 15:46, спустя 4 часа 42 минуты 32 секунды

    Решил попробовать обойтить модулем subprocess, написал такой скрипт

    
    import os, subprocess
    #клонируем репозиторий
    url =  'git@git.my.ru:folder1/folder2.git'
    subprocess.check_call(["git", "clone", url])
    #переходим в получившийся каталог"
    os.system("cd \folder2")
    

    В каталоге много файлов, мне нужно по конкретному файлу вызвать git log
    В консоле я бы сделал git log file1.txt
    Как это сделать в python не могу сообразить, пробовал

    
    subprocess.check_call(["git", "log", "file1.txt"]) 
    

    не получилось, подскажите как это делается?

  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 12 июля 2018 г. 15:55, спустя 8 минут 55 секунд

    @polin11, как-то так

    subprocess.check_call(["git", "--git-dir=folder2/.git", "log", "--", "file1.txt"])
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 12 июля 2018 г. 17:04, спустя 1 час 8 минут 34 секунды

    Мы юзаем GitPython==2.1.5
    для работы файлового менеджера + blame
    Smappi API - Universal Hosting for your API [smappi.org]

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 12 июля 2018 г. 17:06, спустя 1 минуту 45 секунд

    что-то дудов антиспам не работает smile

  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 12 июля 2018 г. 17:22, спустя 16 минут 53 секунды

    @polin11,

    from git import Repo, Commit
    
    repo = Repo.clone_from('git@github.com:smappi/smappi.git', '/tmp/xxx')
    \# Либо, если уже есть репа
    \# repo = Repo('/tmp/xxx')
    
    commits = list(repo.iter_commits('master', max_count=5))
    [{'name': str(c.author), 'email': c.author.email, 'msg': c.message} for c in commits]
    
    [{'name': 'Mikhail Andreev (adw0rd)',
      'email': 'x11org@gmail.com',
      'msg': '0.5.2\n'},
     {'name': 'Mikhail Andreev (adw0rd)',
      'email': 'x11org@gmail.com',
      'msg': 'Support undefined in doctetst (cause undefined is object)\n'},
     {'name': 'Mikhail Andreev (adw0rd)',
      'email': 'x11org@gmail.com',
      'msg': '0.5.1\n'},
     {'name': 'Mikhail Andreev (adw0rd)',
      'email': 'x11org@gmail.com',
      'msg': 'Bugfixed adaptResultByMask when object is undefined\n'},
     {'name': 'Mikhail Andreev (adw0rd)',
      'email': 'x11org@gmail.com',
      'msg': '0.5.0\n'}]
    

    Спустя 109 сек.

    @Sinkler, доволен? )

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 12 июля 2018 г. 17:26, спустя 3 минуты 37 секунд

    норм, через базу вставлял? smile

  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 12 июля 2018 г. 17:27, спустя 34 секунды

    @polin11,

    https://gist.github.com/adw0rd/776860ab63a7ca4b9b1d1e87c20dafda

    from git import Repo, Commit
    repo = Repo.clone_from('git@github.com:smappi/smappi.git', '/tmp/xxx')
    # repo = Repo('/tmp/xxx')
    commits = list(repo.iter_commits('master', max_count=5))
    [{'name': str(c.author), 'email': c.author.email, 'msg': c.message} for c in commits]
    >>>
    [{'name': 'Mikhail Andreev (adw0rd)',
    'email': 'x11org@gmail.com',
    'msg': '0.5.2\n'},
    {'name': 'Mikhail Andreev (adw0rd)',
    'email': 'x11org@gmail.com',
    'msg': 'Support undefined in doctetst (cause undefined is object)\n'},
    {'name': 'Mikhail Andreev (adw0rd)',
    'email': 'x11org@gmail.com',
    'msg': '0.5.1\n'},
    {'name': 'Mikhail Andreev (adw0rd)',
    'email': 'x11org@gmail.com',
    'msg': 'Bugfixed adaptResultByMask when object is undefined\n'},
    {'name': 'Mikhail Andreev (adw0rd)',
    'email': 'x11org@gmail.com',
    'msg': '0.5.0\n'}]

    Спустя 55 сек.

    норм, через базу вставлял? smile

    @Sinkler, новые сообщения дает писать, а то старое не получилось отредактировать, чтобы небыло так страшно как сейчас

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • polin11

    Сообщения: 41 Репутация: N Группа: Кто попало

    Spritz 14 июля 2018 г. 20:04, спустя 2 дня 2 часа 37 минут

    Спасибо за рабочий пример!
    Меня интересует следующее: в репозитории много файлов,
    мне нужно определить автора последнего коммита, который изменил определенный файл,
    не подскажите как это сделать?

  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 15 июля 2018 г. 0:32, спустя 4 часа 27 минут 54 секунды

    @polin11,
    https://gist.github.com/adw0rd/6763366d55c8c61a0cb58e2fd56e0c85

    In [1]: from git import Repo, Commit
    In [2]: repo = Repo('/tmp/xxx')
    In [3]: list(repo.iter_commits('master', 'README.md', max_count=1))[0].author
    Out[3]: <git.Actor "Mikhail Andreev (adw0rd) <x11org@gmail.com>">

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • polin11

    Сообщения: 41 Репутация: N Группа: Кто попало

    Spritz 16 июля 2018 г. 0:43, спустя 1 день 11 минут

    @adw0rd,
    Спасибо большое, это то, что мне нужно!!!
    Скажите пожалуйста, клонировать репозиторий это единственный вариант?
    Репозиторий достаточно большой, клонирование занимает определённое время и место на диске,
    возможно ли отправить в github какой-нибудь запрос, и получить автора последнего коммита, изменившего определенный файл?

  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 16 июля 2018 г. 12:25, спустя 11 часов 41 минуту 41 секунду

    @polin11, сам git такое не умеет, но такое возможно сделать через API Commits | GitHub Developer Guide [developer.github.com]

    Спустя 191 сек.

    https://gist.github.com/adw0rd/e62b9a4596e99635e24f70e675894ec0

    % curl "https://api.github.com/repos/smappi/smappi/commits?path=README.md"|head -n42
    {
    "sha": "01379e9475822e439749dbfc0ef3d9bcc4939601",
    "node_id": "MDY6Q29tbWl0MTA4MTM0MDU3OjAxMzc5ZTk0NzU4MjJlNDM5NzQ5ZGJmYzBlZjNkOWJjYzQ5Mzk2MDE=",
    "commit": {
    "author": {
    "name": "Mikhail Andreev",
    "email": "x11org@gmail.com",
    "date": "2018-07-13T12:10:50Z"
    },
    "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "date": "2018-07-13T12:10:50Z"
    },
    "message": "Update README.md",
    "tree": {
    "sha": "2a86ad0ddbc9d26d7d3f9dd082953cae0f415d8d",
    "url": "https://api.github.com/repos/smappi/smappi/git/trees/2a86ad0ddbc9d26d7d3f9dd082953cae0f415d8d"
    },
    "url": "https://api.github.com/repos/smappi/smappi/git/commits/01379e9475822e439749dbfc0ef3d9bcc4939601",
    "comment_count": 0,
    },
    "url": "https://api.github.com/repos/smappi/smappi/commits/01379e9475822e439749dbfc0ef3d9bcc4939601",
    "html_url": "https://github.com/smappi/smappi/commit/01379e9475822e439749dbfc0ef3d9bcc4939601",
    "comments_url": "https://api.github.com/repos/smappi/smappi/commits/01379e9475822e439749dbfc0ef3d9bcc4939601/comments",
    "author": {
    "login": "adw0rd",
    "id": 546889,
    "node_id": "MDQ6VXNlcjU0Njg4OQ==",
    "avatar_url": "https://avatars3.githubusercontent.com/u/546889?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/adw0rd",
    "html_url": "https://github.com/adw0rd",
    "followers_url": "https://api.github.com/users/adw0rd/followers",
    "following_url": "https://api.github.com/users/adw0rd/following{/other_user}",

    https://smappi.org/ - платформа по созданию API на все случаи жизни

Пожалуйста, авторизуйтесь, чтобы написать комментарий!