Mam następujący kod (patrz komentarze do tego, co się dzieje):JGit ustawia git: URI zamiast https: na pilocie na CircleCI
// Clone repository from GitHub into a local directory.
Git git = Git.cloneRepository()
.setBranch("gh-pages")
.setURI("https://github.com/RAnders00/KayonDoc.git")
.setDirectory(new File("/home/ubuntu/KayonDoc"))
.call();
// Print out remotes in config from JGit
Config config = git.getRepository().getConfig();
config.getSubsections("remote").forEach(it -> {
System.out.println(config.getString("remote", it, "url"));
});
// Prints https://github.com/RAnders00/KayonDoc.git
// Everything seems OK
// You could perform some changes to the repository here...
// Push changes to origin
git.push()
.setCredentialsManager(new UsernamePasswordCredentialsProvider("RAnders00", "hunter2"))
.call();
// Throws exception (look below)
Caught: org.eclipse.jgit.api.errors.TransportException: [email protected]:RAnders00/KayonDoc.git: push not permitted
org.eclipse.jgit.api.errors.TransportException: [email protected]:RAnders00/KayonDoc.git: push not permitted
at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:164)
at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:80)
at <your class> (YourClass.java:?)
Caused by: org.eclipse.jgit.errors.TransportException: [email protected]:RAnders00/KayonDoc.git: push not permitted
at org.eclipse.jgit.transport.BasePackPushConnection.noRepository(BasePackPushConnection.java:176)
at org.eclipse.jgit.transport.BasePackConnection.readAdvertisedRefsImpl(BasePackConnection.java:200)
at org.eclipse.jgit.transport.BasePackConnection.readAdvertisedRefs(BasePackConnection.java:178)
at org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init>(TransportGitSsh.java:341)
at org.eclipse.jgit.transport.TransportGitSsh.openPush(TransportGitSsh.java:166)
at org.eclipse.jgit.transport.PushProcess.execute(PushProcess.java:154)
at org.eclipse.jgit.transport.Transport.push(Transport.java:1200)
at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:157)
... 3 more
JGit jest uratowanie git:
url do .git/FETCH_HEAD
plik, który jest następnie używany do pchania. Ponieważ protokół git:
nie obsługuje uwierzytelniania, nie można przesłać do pilota, a proces kończy się niepowodzeniem.
Plik .git/config
zawiera poprawny identyfikator URI dla https:
dla pilota (dlatego kod drukuje identyfikator URI https:
).
Moje pytanie brzmi:
Co mogę zrobić, aby JGit ustawić https:
URI poprawnie
(które następnie pozwala mi ponownie wcisnąć)?
Ten problem pojawia się tylko w bardzo szczególnych warunkach (na CircleCI, wirtualne skrzynki Ubuntu 12.04.2 LTS) - to nie jest odtwarzalny na 15.10, 14.04 LTS i 12.04.2 LTS świeże dystrybucje Ubuntu i nie odtwarzalny na Windows.
Najprostszym sposobem na odtworzenie problemu jest create pozorne repozytorium GitHub, następnie start building swój fałszywy projekt na CircleCI, a następnie ponowne uruchomienie pierwszego kompilacji za pomocą SSH. Następnie masz 30 minut czasu SSH, aby przesłać dowolne pliki groovy/java do skrzynki. Po 30 minutach skrzynia zostanie przymusowo wyłączona.
Jeśli używam git remote -v
w katalogu ten wklonowano, otrzymuję: (co wskazuje na mnie fakt, że git:
URI są rzeczywiście używany)
origin [email protected]:RAnders00/KayonDoc.git (fetch)
origin [email protected]:RAnders00/KayonDoc.git (push)
Mogę potwierdzić, że w systemie Windows adresy URL https pozostają nienaruszone. Jeśli nie ma to miejsca w Linuksie, wydaje się, że to błąd, a ja [plik bugzilla] (https://eclipse.org/jgit/support/). –
Tak, jednak szybkie spojrzenie na kod nie wykazało oczywistego powodu, konfiguracja jest zbudowana na podstawie ustawionego adresu URL bez żadnej korekty schematu.Być może możesz zrobić szybkie debugowanie w JGit na swoim komputerze, aby wykluczyć niepoprawne użycie API w kodzie ... – centic
Gdybym był tobą, po prostu użyłbym protokołu git z kluczami ssh – AdamSkywalker