Skip to contentSkip to conversation

Question: Is it possible to host a writable git repo over both http and ssh?

DISCUSSION Mike Gaffney 5 participants 9 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

I am trying to setup a git repo internally at my work. I would like to make the repo accessable via https for both read and write so that we may access it from customer locations which don't allow anything but https. I would also like to host it via SSH because that protocol is much faster. I know that when you push with http it runs 'git update-server-info', would I have to make the ssh pushes do the same? Will this even work?

Thanks,
Mike Gaffney

#1 lore raw
Quoted 6 lines · Mike Gaffney

I am trying to setup a git repo internally at my work. I would like to make the repo accessable via https for both read and write so that we may access it from customer locations which don't allow anything but https. I would also like to host it via SSH because that protocol is much faster. I know that when you push with http it runs 'git update-server-info', would I have to make the ssh pushes do the same? Will this even work?

Yes, it should work just fine. All pushes, no matter how they arrive at the repository, will need to run "git update-server-info", which is what allows "dumb" protocols like http to read from the repository. The default post-update hook does this; you just need to enable it by "cd .git/hooks && mv post-update.sample post-update".

-Peff

#2 lore raw

Does this go for JGit as well?

-Mike

Quoted 16 lines · Jeff King
Quoted 6 lines · Mike Gaffney

I am trying to setup a git repo internally at my work. I would like to make the repo accessable via https for both read and write so that we may access it from customer locations which don't allow anything but https. I would also like to host it via SSH because that protocol is much faster. I know that when you push with http it runs 'git update-server-info', would I have to make the ssh pushes do the same? Will this even work?

Yes, it should work just fine. All pushes, no matter how they arrive at the repository, will need to run "git update-server-info", which is what allows "dumb" protocols like http to read from the repository. The default post-update hook does this; you just need to enable it by "cd .git/hooks && mv post-update.sample post-update".

-Peff

Signature · 1 line
-Mike Gaffney (http://rdocul.us)
#3 lore raw
Quoted 1 line · Mike Gaffney

Does this go for JGit as well?

The hook must be enabled on the server side; are you running JGit on the server, or regular git?

-Peff

#4 lore raw

I'm actually trying to take what Sean did with gerrit and extract a full Java/MinaSSHD based server that doesn't require a real user account and is configurable by spring. So yes, I'm using JGit on the server.

-Mike

Quoted 8 lines · Jeff King
Quoted 1 line · Mike Gaffney

Does this go for JGit as well?

The hook must be enabled on the server side; are you running JGit on the server, or regular git?

-Peff

Signature · 1 line
-Mike Gaffney (http://rdocul.us)
#5 lore raw
Quoted 4 lines · Mike Gaffney

I'm actually trying to take what Sean did with gerrit and extract a full Java/MinaSSHD based server that doesn't require a real user account and is configurable by spring. So yes, I'm using JGit on the server.

Ah. In that case, I don't know whether JGit respects all hooks. You should ask Shawn (Shawn, we are talking about a post-update to run update-server-info). :)

-Peff

#6 lore raw

torsdag 26 mars 2009 05:56:51 skrev Jeff King <[email protected]>:

Quoted 10 lines · Mike Gaffney
Quoted 5 lines

I'm actually trying to take what Sean did with gerrit and extract a full Java/MinaSSHD based server that doesn't require a real user account and is configurable by spring. So yes, I'm using JGit on the server.

Ah. In that case, I don't know whether JGit respects all hooks. You should ask Shawn (Shawn, we are talking about a post-update to run update-server-info). :)

Arguably it should. but it doesn't. Then there is a question as to what format those hooks should be. Shell scripts would run into platform issues and jgit based stuff should have as little as possible of that, but a similar mechanism should exist.

-- robin

#7 lore raw
Quoted 11 lines · Robin Rosenberg

torsdag 26 mars 2009 05:56:51 skrev Jeff King <[email protected]>:

Quoted 9 lines · Mike Gaffney
Quoted 5 lines

I'm actually trying to take what Sean did with gerrit and extract a full Java/MinaSSHD based server that doesn't require a real user account and is configurable by spring. So yes, I'm using JGit on the server.

Ah. In that case, I don't know whether JGit respects all hooks. You should ask Shawn (Shawn, we are talking about a post-update to run update-server-info). :)

Quoted 7 lines

Arguably it should. but it doesn't. Then there is a question as to what format those hooks should be. Shell scripts would run into platform issues and jgit based stuff should have as little as possible of that, but a similar mechanism should exist.

-- robin

Maybe support executing scripts via Bean Scripting Framework?

That would allow scripts to be written in any of the supported languages, as long as the appropriate interpreter is present.

e.g. BeanShell, Groovy, Jython, etc

See http://jakarta.apache.org/bsf/

If you define an interface for each hook, the scripts could implement the interface, and execute that way.

Here is an example, mishmashed from
<http://www.beanshell.org/examples/actionhandler.html> and
<http://jvm-languages.com/wiki/Bean_Scripting_Framework#Interacting_with_Complex_Objects>:

======8x===== Java code =========
public class BSFFileUtils
{
public Object evalFile (BSFManager manager, File file)
throws IOException

   {
      String fileName = file.getPath();

      String language = manager.getLangFromFilename(fileName);
      String code = extractFileContents(file);

      return manager.eval(language, fileName, 0, 0, code);

}

   private String extractFileContents (File file)
      throws IOException
   {
      StringBuffer buf = new StringBuffer();
      BufferedReader r = new BufferedReader(new FileReader(file));
      try {
         int len;
         char[] chars = new char[8192];

         while ((len = r.read(chars, 0, chars.length)) != -1) {
           buf.append(chars, 0, len);
         }

         return buf.toString();
      } finally {
          r.close();
      }

}
}

public static void main (String[] args)
{
String directory = args[0];
File file = new File("actionHandler.bsh");

   BSFManager manager = new BSFManager();

ActionListener listener = (ActionListener)
BSFFileUtils.evalFile(manager, file);

   JButton button = new JButton("MyButton");
   button.addActionListener(listener);

JFrame f = new JFrame();
f.getContentPane().add( button );
f.show();
}

======8x===== BeanShell code ========= actionHandler.bsh

import java.awt.event.ActionListener;

actionPerformed( e ) {
    print("Button Pressed: " + e);
}

return (ActionListener)this;

======8x==============================

Having said all this, it is probably worth implementing update-server-info in Java, so as to avoid having to shell out to perform this action, and keep it all platform-independent.

Rogan

#8 lore raw
Quoted 11 lines · Rogan Dawes
Quoted 10 lines · Robin Rosenberg

torsdag 26 mars 2009 05:56:51 skrev Jeff King <[email protected]>:

Quoted 9 lines · Mike Gaffney
Quoted 5 lines

I'm actually trying to take what Sean did with gerrit and extract a full Java/MinaSSHD based server that doesn't require a real user account and is configurable by spring. So yes, I'm using JGit on the server.

Ah. In that case, I don't know whether JGit respects all hooks. You should ask Shawn (Shawn, we are talking about a post-update to run update-server-info). :)

JGit already has the native code needed for update-server-info. Look at WalkPushConnection:

line 185-187 calls refWriter.writeInfoRefs() to update the GIT_DIR/info/refs for dumb transports. We just need to call that in the end of the receive code.

line 236 calls WalkRemoteObjectDatabase.writeInfoPacks() to update the GIT_DIR/objects/info/packs file. This needs to be abstracted out so we can more easily reuse it.

Quoted 4 lines
Quoted 4 lines

Arguably it should. but it doesn't. Then there is a question as to what format those hooks should be. Shell scripts would run into platform issues and jgit based stuff should have as little as possible of that, but a similar mechanism should exist.

Yup, I agree.

At the very least we should suppot doing the update-server-info logic from pure Java, as it is probably the most common operation people would want in a post receive hook.

Quoted 11 lines

Maybe support executing scripts via Bean Scripting Framework?

That would allow scripts to be written in any of the supported languages, as long as the appropriate interpreter is present.

e.g. BeanShell, Groovy, Jython, etc

See http://jakarta.apache.org/bsf/

If you define an interface for each hook, the scripts could implement the interface, and execute that way.

Yes, that is one option. I'd like to get a reasonable binding to BSF for JGit, but its more of a wish than a real need for me, so I just don't bother. I think many people who want to script Git from Python would be reasonably happy with executing that script through Jython if there was a decent binding.

Signature · 1 line
Shawn.