Я думал, что отвечу на свой вопрос, так как я иду по другому пути, чем предложено в ответах. Тем не менее, спасибо тем, кто ответил.
Во-первых, краткий обзор моего опыта работы с GitPython, PyGit и Dulwich:
Кроме того, StGit выглядит интересным, но мне бы понадобились функции, извлеченные в отдельный модуль, и я не хочу ждать, пока это произойдет прямо сейчас.
За (гораздо) меньшее время, чем я потратил на попытки получить три выше работающих модулей, мне удалось получить команды git, работающие через модуль подпроцесса, например
def gitAdd(fileName, repoDir):
cmd = ['git', 'add', fileName]
p = subprocess.Popen(cmd, cwd=repoDir)
p.wait()
gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')
Это еще не полностью включено в мою программу, но я не предвижу проблемы, кроме, возможно, скорости (поскольку я буду обрабатывать сотни или даже тысячи файлов).
Возможно, у меня просто не хватило терпения наладить работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.
За (гораздо) меньшее время, чем я потратил на то, чтобы заставить работать три вышеуказанных модуля, мне удалось заставить команды git работать через модуль подпроцесса, например
def gitAdd(fileName, repoDir):
cmd = ['git', 'add', fileName]
p = subprocess.Popen(cmd, cwd=repoDir)
p.wait()
gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')
Это еще не полностью включено в мою программу, но я я не предвижу проблемы, за исключением, может быть, скорости (так как я буду обрабатывать сотни или даже тысячи файлов время от времени).
Возможно, у меня просто не хватило терпения, чтобы начать работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.
За (гораздо) меньшее время, чем я потратил на то, чтобы заставить работать три вышеуказанных модуля, мне удалось заставить команды git работать через модуль подпроцесса, например
def gitAdd(fileName, repoDir):
cmd = ['git', 'add', fileName]
p = subprocess.Popen(cmd, cwd=repoDir)
p.wait()
gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')
Это еще не полностью включено в мою программу, но я я не предвижу проблем, за исключением, может быть, скорости (поскольку я буду обрабатывать сотни или даже тысячи файлов время от времени).
Может быть, у меня просто не хватило терпения, чтобы начать работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.
время от времени я буду обрабатывать сотни или даже тысячи файлов.)Возможно, мне просто не хватило терпения наладить работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.
время от времени я буду обрабатывать сотни или даже тысячи файлов.)Возможно, мне просто не хватило терпения наладить работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.
Может быть, это и помогает, но Bazaar и Mercurial оба используют dulwich для взаимодействия с Git.
Dulwich, вероятно, отличается от другого в том смысле, что это повторная реализация git на python. Другой может быть просто оболочкой для команд Git (чтобы было проще использовать с точки зрения высокого уровня: фиксация / добавление / удаление), это, вероятно, означает, что их API очень близок к командной строке git, поэтому вам понадобится чтобы получить опыт работы с Git.
Часть библиотеки взаимодействия git в StGit на самом деле довольно хороша. Тем не менее, он не разбит на отдельный пакет, но я уверен, что при наличии достаточного интереса это можно исправить.
В нем есть очень хорошие абстракции для представления коммитов, деревьев и т. Д., А также для создания новых коммитов и деревьев .
JDBC API является отличным примером для этого. В этом пути драйвер JDBC можно настроить извне, например, в файле свойств
driver = com.dbvendor.jdbc.Driver url = jdbc:dbvendor://localhost/dbname username = stackoverflow password = youneverguess
.. который можно использовать как
Properties properties = new Properties();
properties.load(Thread.currentThread().getResourceAsStream("jdbc.properties"));
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);
Каждая реализация драйвера JDBC в основном регистрируется в DriverManager
внутри статического
блока инициализатора. Это именно тот, который выполняется во время Class # forName ()
.
package com.dbvendor.jdbc;
public class Driver implements java.sql.Driver {
static {
java.sql.DriverManager.registerDriver(new Driver());
}
private Driver() {
// ...
}
public boolean acceptsURL(String url) {
return url.startsWith("jdbc:dbvendor");
}
}
Поскольку DriverManager
примерно выглядит так (он фактически использует старомодный Vector
)
private static final Set<Driver> drivers = new HashSet<Driver>();
public static void registerDriver(Driver driver) {
drivers.add(driver);
}
public static Connection getConnection(String url, String username, String password) throws SQLException {
for (Driver driver : drivers) {
if (driver.acceptsURL(url)) {
return driver.connect(url, username, password);
}
}
throw new SQLException("No suitable driver");
}
... вы можете получить от него подключение без необходимости создания экземпляра самого драйвера!
В этом пути код JDBC является очень портативным. Можно изменить БД или распределить код между пользователями с различными БД без необходимости изменения/взлома/перестроения самого кода.
Этот подход используют не только JDBC, но и другие API, такие как Servlet API, ORM, такие как Hibernate/JPA, рамки ввода зависимостей и т.д. использует отражение для загрузки классов на основе настраиваемых извне файлов свойств, файлов конфигурации XML и/или аннотаций. Все это делает код более портативным и съемным.
-121--1732675-Из моего опыта поведение статики, определенной в области файла, отличается от статики, определенной в функции
Область файла инициализируется безопасно до того, как все потоки переходят, область функции - нет.
Обратите внимание, что это, по-видимому, зависит от версий компилятора (которые вы ожидаете, учитывая, что мы идем в «неопределенных» областях поведения)
-121--3113862-Для записи ни одна из вышеупомянутых библиотек Git Python, кажется, не содержит эквивалента «git status», что действительно единственное, что я хотел бы, поскольку работа с остальными командами git через подпроцессы так просто.
Для полноты картины http://github.com/alex/pyvcs/ является слоем абстракции для всех DVD-дисков. Он использует Dulwich, но обеспечивает взаимодействие с другими DVD.