2015-11-20 49 views
15

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) 
+0

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/). –

+0

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

+0

Gdybym był tobą, po prostu użyłbym protokołu git z kluczami ssh – AdamSkywalker

Odpowiedz

2

wygląda zdefiniowaniu

Przepisywanie URL

Git dostarcza drogę do przepisywania adresów URL o następującej konfiguracji:

git config --global url."git://".insteadOf https:// 

Aby sprawdzić, czy masz ustawione to sprawdzić konfigurację repozytorium:

git config --list 

Zobaczysz następującą linię na wyjściu:

url.git://.insteadof=https:// 

Można także sprawdzić .gitconfig pliki do sprawdzenia, czy nie ma tego wpisu w plikach konfiguracyjnych

[url "git://"] 
    insteadOf = https:// 
+1

O mój Boże, ta genialna odpowiedź jest rozwiązaniem. 'ubuntu @ box304: ~ $ git config - lista' daje' [email protected]: .insteadof = https: // github.com/'- aby usunąć tę konfigurację, uruchom'> ~/.gitconfig' (nadpisać konfigurację) na CircleCI w sekcji 'machine' pliku' circle.yml'. – RAnders00

+0

Cieszę się, że mogę Ci pomóc :-) – CodeWizard