git-lfs-migrate icon indicating copy to clipboard operation
git-lfs-migrate copied to clipboard

ssh protocol for LFS

Open masics opened this issue 8 years ago • 21 comments

I'm trying to migrate to LFS with ssh protocol but instead I get an error: ssh protocol is not supported How to make it working? Thank you.

masics avatar Feb 18 '17 09:02 masics

Can you show running command and error message?

bozaro avatar Feb 18 '17 21:02 bozaro

Sure: $ java -jar git-lfs-migrate/git-lfs-migrate.jar -s orig_bare -d work3 -l ssh://artifactory.domain.com:1339/artifactory/test "*.dll" Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {}->ssh://artifactory.domain.com:1339: ssh protocol is not supported Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: Retrying request to {}->ssh://artifactory.domain.com:1339 Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {}->ssh://artifactory.domain.com:1339: ssh protocol is not supported Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: Retrying request to {}->ssh://artifactory.domain.com:1339 Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {}->ssh://artifactory.domain.com:1339: ssh protocol is not supported Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: Retrying request to {}->ssh://artifactory.domain.com:1339 [main] INFO git.lfs.migrate.Main - LFS server: Batch API request exception org.apache.http.conn.UnsupportedSchemeException: ssh protocol is not supported at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:108) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) at ru.bozaro.gitlfs.client.internal.HttpClientExecutor.executeMethod(HttpClientExecutor.java:26) at ru.bozaro.gitlfs.client.Client.doRequest(Client.java:275) at ru.bozaro.gitlfs.client.Client.lambda$postBatch$7(Client.java:118) at ru.bozaro.gitlfs.client.Client.doWork(Client.java:252) at ru.bozaro.gitlfs.client.Client.postBatch(Client.java:118) at git.lfs.migrate.Main.checkLfsAuthenticate(Main.java:113) at git.lfs.migrate.Main.main(Main.java:66) Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {}->ssh://artifactory.domain.com:1339: ssh protocol is not supported Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: Retrying request to {}->ssh://artifactory.domain.com:1339 Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {}->ssh://artifactory.domain.com:1339: ssh protocol is not supported Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: Retrying request to {}->ssh://artifactory.domain.com:1339 Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: I/O exception (org.apache.http.conn.UnsupportedSchemeException) caught when processing request to {}->ssh://artifactory.domain.com:1339: ssh protocol is not supported Feb 19, 2017 1:43:10 AM org.apache.http.impl.execchain.RetryExec execute INFO: Retrying request to {}->ssh://artifactory.domain.com:1339 [main] ERROR git.lfs.migrate.Main - LFS server: Invalid base URL

masics avatar Feb 18 '17 23:02 masics

As I known, Git LFS use only HTTP for transport.

As I known, artifactory uses URL like:

     -l http://<user>:<pwd>@<server>/artifactory/api/lfs/<lfs-repo>

I make some Git LFS investigations in Dec 2016 with trial Artifactory: https://github.com/bozaro/git-lfs-java/issues/4

bozaro avatar Feb 19 '17 10:02 bozaro

Artifactory can use ssh for authentication (as any other LFS service). Then, all transactions are done via HTTP(s). https://github.com/git-lfs/git-lfs/blob/master/docs/api/authentication.md

masics avatar Feb 19 '17 11:02 masics

Another question - why do you care about it? Can you just put this info into .lfsconfig file and let me push it with original LFS?

masics avatar Feb 19 '17 11:02 masics

You can specify Git repository URL with -g option:

-g ssh://artifactory.domain.com:1339/artifactory/test

But I'm not sure about port parameter...

bozaro avatar Feb 19 '17 11:02 bozaro

Git repository and LFS are separate services. Git is located at Bitbucket while LFS is at Artifactory.

masics avatar Feb 19 '17 11:02 masics

You can specify:

  • With -l parameter: direct Git LFS server (HTTP only);
  • With -g parameter: Git URL. This URL can as HTTP server (in this case LFS URL calculates by simple URL Path modification) and SSH URL (in this case LFS URL gets by invoking git-lfs-authenticate command).

bozaro avatar Feb 19 '17 11:02 bozaro

Another question - why do you care about it? Can you just put this info into .lfsconfig file and let me push it with original LFS?

I did not understand your question. You can even omit the -g and -l options, and then upload LFS files manually (it would located at objects/lfs directory).

bozaro avatar Feb 19 '17 11:02 bozaro

I did not understand your question. You can even omit the -g and -l options, and then upload LFS files manually (it would located at objects/lfs directory). I can. But without proper .lfsconfig it will be hard for users to clone/checkout.

masics avatar Feb 19 '17 11:02 masics

But without proper .lfsconfig it will be hard for users to clone/checkout.

It's unrelated problems. This file is outside working copy and all users should create it manually.

bozaro avatar Feb 19 '17 11:02 bozaro

It's unrelated problems. This file is outside working copy and all users should create it manually.

Why users should create it manually??? It should be part of the repo. All LFS files are located at predefined server at predefined folder. It's a constant.

masics avatar Feb 19 '17 11:02 masics

Manual git-lfs service configutaions usually used for testing and working with unconfigured git-lfs vs git intergration. In common case user simply make git clone. Git LFS client detect LFS service location by https://github.com/git-lfs/git-lfs/blob/master/docs/api/server-discovery.md logic without any additional configurations files in client environment or working copy.

bozaro avatar Feb 19 '17 11:02 bozaro

In common case user simply make clone. Git LFS client detect LFS service location by https://github.com/git-lfs/git-lfs/blob/master/docs/api/server-discovery.md logic without any additional configurations files in client environment or workingh copy.

This is working if Git server serves as LFS storage. If they are different you cannot "guess" configuration from git url. And here comes the .lfsconfig with LFS url.

masics avatar Feb 19 '17 11:02 masics

This is working if Git server serves as LFS storage.

No. Git server should provide only integration point:

  • For SSH users: git-lfs-authenticate command.
  • For HTTP users: https://<git repo>.git/info/lfs/batch proxy to LFS server.

If you want to use Git server and LFS storage without discovery integration, you will feel pain.

bozaro avatar Feb 19 '17 11:02 bozaro

If you want to use Git server and LFS storage without discovery integration, you will feel pain.

How exactly you can configure Git server to provide LFS url on external server? What Git server you are using that provides this functionality?

masics avatar Feb 19 '17 12:02 masics

What Git server you are using that provides this functionality?

In my case I use GitLab as Git server and Git as Subversion as LFS external storage. But I do not think that this solution is suitable for everyone.

bozaro avatar Feb 19 '17 13:02 bozaro

In my case it is Bitbucket and Artifactory. And I cannot get Bitbucket to make authentication for Artifactory. I need .lfsconfig file to do that.

masics avatar Feb 19 '17 13:02 masics

Both of them (Bitbucket and Artifactory) is proprietary and I can't install them to help you.

I would also highly recommend you assess the feasibility of using Artifactory as a repository Git LFS: as at December 2016 the implementation of server strongly did not meet specifications (https://github.com/bozaro/git-lfs-java/issues/4). I was under the impression that Git LFS storage feature is implemented in Artifactory only for marketing.

bozaro avatar Feb 19 '17 13:02 bozaro

They must have fixed that in version 5.0.1. Everything is working if I supply .lfsconfig file. Unfortunately this configuration is what is forced on me and I have to live with that.

masics avatar Feb 19 '17 13:02 masics

We have the same use case. We are using various git repositories (bitbucket, gerritt, etc) paired with Artifactory. I agree with @masics that splitting git from lfs would be nice. It's unfortunate that there is not a way for you to develop/test against it. I would work on a PR, but I think for us, simply modifying the repo after conversion will be good enough. We have many repos, but we also have many engineering teams.

gronka avatar May 15 '17 20:05 gronka