В последних версиях JGit (3.3+) вы можете установить переменную среды GIT_CONFIG_NOSYSTEM
в любое значение, и это подавит чтение собственного общесистемного файла конфигурации Git. Это определено в исходниках JGit через Constants#GIT_CONFIG_NOSYSTEM_KEY
.
Это имитирует наличие пустого файла конфигурации системного уровня и предотвращает поиск кода в случайных путях к файлам и провоцирование исключений безопасности, что было задано в исходном вопросе. Обратите внимание, что даже в этом сценарии JGit по-прежнему пытается использовать файл конфигурации пользовательского уровня (обычно в $HOME/.gitconfig
).
Более распространенный вариант этого вопроса, по-видимому, заключается в использовании предопределенного набора параметров конфигурации, не беспокоясь о каком-либо загрязнении окружающей среды (системные или пользовательские конфигурации), поэтому приведенное выше исправление не закрывает все пробелы.
В следующем примере показано, как использовать JGit для использования определенного пользовательского файла конфигурации Git по определенному пути, и он предоставляет пустой файл конфигурации Git системного уровня, что означает, что всей конфигурацией можно управлять программно.
Чтобы использовать это, установите свой собственный SystemReader, используя приведенный ниже код, прежде чем запускать какие-либо команды JGit:
File userGitConfig = new File("/my/path/foo.config");
SystemReader.setInstance(new CustomConfigSystemReader(userGitConfig));
А затем укажите следующий новый класс CustomConfigSystemReader
:
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.SystemReader;
import java.io.File;
public class CustomConfigSystemReader extends SystemReader
{
private static final SystemReader proxy = SystemReader.getInstance();
private File userGitConfig;
public CustomConfigSystemReader(File userGitConfig)
{
super();
this.userGitConfig = userGitConfig;
}
@Override
public String getenv(String variable)
{
return proxy.getenv(variable);
}
@Override
public String getHostname()
{
return proxy.getHostname();
}
@Override
public String getProperty(String key)
{
return proxy.getProperty(key);
}
@Override
public long getCurrentTime()
{
return proxy.getCurrentTime();
}
@Override
public int getTimezone(long when)
{
return proxy.getTimezone(when);
}
@Override
public FileBasedConfig openUserConfig(Config parent, FS fs)
{
return new FileBasedConfig(parent, userGitConfig, fs);
}
// Return an empty system configuration, based on example in SystemReader.Default#openSystemConfig
@Override
public FileBasedConfig openSystemConfig(Config parent, FS fs)
{
return new FileBasedConfig(parent, null, fs)
{
@Override
public void load()
{
}
@Override
public boolean isOutdated()
{
return false;
}
};
}
}
person
Scott Dudley
schedule
29.11.2019