2021-10-31 15:57:30 +02:00
|
|
|
# JGit SSH support via JSch
|
|
|
|
|
|
|
|
This bundle provides an implementation of git transport over SSH implemented via JSch.
|
|
|
|
|
|
|
|
**This bundle should be considered deprecated**. It is essentially unmaintained, and
|
|
|
|
the JGit project may decide anytime to remove it completely without further ado.
|
|
|
|
|
|
|
|
The officially supported SSH transport is in bundle `org.eclipse.jgit.ssh.apache` and is
|
|
|
|
built upon [Apache MINA sshd](https://mina.apache.org/sshd-project/).
|
|
|
|
|
|
|
|
## Service registration
|
|
|
|
|
|
|
|
This bundle declares a service for the `java.util.ServiceLoader` for interface
|
|
|
|
`org.eclipse.jgit.transport.ssh.SshSessionFactory`. The core JGit bundle uses the service
|
|
|
|
loader to pick up an implementation of that interface. The bundle in an OSGi fragment
|
|
|
|
to ensure that the service loader works in an OSGi environment without the need to
|
|
|
|
install a service loader bridge.
|
|
|
|
|
|
|
|
Note that JGit simply uses the first `SshSessionFactory` provided by the `ServiceLoader`.
|
|
|
|
|
|
|
|
## Using a different SSH implementation
|
|
|
|
|
|
|
|
To use a different SSH implementation:
|
|
|
|
|
|
|
|
* Do not include this bundle in your product.
|
|
|
|
* Include the bundle of the alternate implementation.
|
|
|
|
* If the service loader finds the alternate implementation, nothing more is needed.
|
|
|
|
* Otherwise ensure the service declaration from the other bundle is on the Classpath of bundle `org.eclipse.jgit`,
|
|
|
|
* or set the `SshSessionFactory` for JGit explicitly (see below).
|
|
|
|
|
|
|
|
## Configuring an SSH implementation for JGit
|
|
|
|
|
|
|
|
The simplest way to set an SSH implementation for JGit is to install it globally via
|
|
|
|
`SshSessionFactory.setInstance()`. This instance will be used by JGit for all SSH
|
|
|
|
connections by default.
|
|
|
|
|
|
|
|
It is also possible to set the SSH implementation individually for any git command
|
|
|
|
that needs a transport (`TransportCommand`) via a `org.eclipse.jgit.api.TransportConfigCallback`.
|
|
|
|
|
|
|
|
To do so, set the wanted `SshSessionFactory` on the SSH transport, like:
|
|
|
|
|
|
|
|
```java
|
|
|
|
SshSessionFactory customFactory = ...; // Get it from wherever
|
|
|
|
FetchCommand fetch = git.fetch()
|
|
|
|
.setTransportConfigCallback(transport -> {
|
|
|
|
if (transport instanceof SshTransport) {
|
|
|
|
((SshTransport) transport).setSshSessionFactory(customFactory);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
...
|
|
|
|
.call();
|
|
|
|
```
|
|
|
|
|
|
|
|
## Using an external SSH executable
|
|
|
|
|
|
|
|
JGit has built-in support for not using any Java SSH implementation but an external SSH
|
|
|
|
executable. To use an external SSH executable, set environment variable **GIT_SSH** to
|
|
|
|
the path of the executable. JGit will create a sub-process to run the executable and
|
2021-11-13 20:00:58 +02:00
|
|
|
communicate with this sub-process to perform the git operation.
|