{"id":2467,"date":"2017-11-25T09:21:06","date_gmt":"2017-11-25T09:21:06","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=2467"},"modified":"2017-11-25T12:54:56","modified_gmt":"2017-11-25T12:54:56","slug":"cgit-un-visor-vistoso-para-un-repositorio-git","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2017\/11\/25\/cgit-un-visor-vistoso-para-un-repositorio-git\/","title":{"rendered":"cgit: un visor vistoso para un repositorio git"},"content":{"rendered":"<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:706,&quot;href&quot;:&quot;https:\\\/\\\/packages.debian.org\\\/cgit&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415145641\\\/https:\\\/\\\/packages.debian.org\\\/cgit&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-17 17:54:02&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-17 17:54:02&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]'><\/div>\n<p>Y mira que le he dado vueltas y vueltas a <em>gitweb<\/em>, el programa que se incluye casi de facto en cualquier instalaci\u00f3n <em>git<\/em>. Pero nada, han sido quince minutos con <em>cgit<\/em> y he conseguido todo lo que pretend\u00eda.<\/p>\n<p><!--more--><\/p>\n<p>Y lo que pretend\u00eda era muy sencillo: un visor web a mis repositorios <em>git<\/em>.<\/p>\n<p>La parte de creaci\u00f3n y de mantenimiento de estos repositorios la llevo a cabo mediante conexiones seguras (<em>ssh<\/em>) y cuentas concretas. Lo normal y lo que funciona sin problemas.<\/p>\n<p>Pero quer\u00eda ver los repositorios y, mejor a\u00fan, ser capaz de clonarlos empleando una URL sencilla de recordar. Ya que tengo un dominio concreto para ellos &#8211;<em>https:\/\/git.example.net<\/em>&#8211; quer\u00eda ser capaz de ejecutar algo como:<\/p>\n<pre class=\"lang:sh decode:true \">$ git clone https:\/\/git.example.net\/myrepo.git \r\n<\/pre>\n<p>Porque muchas veces necesito acceder al contenido en lugares en los que no tengo montado un entorno de desarrollo ni pretendo crear nada.<\/p>\n<p>Despu\u00e9s de las peleas que he tenido con <em>gitweb<\/em> y el servidor web Apache encontrar algo tan sencillo como <em>cgit<\/em> ha sido todo un alivio.<\/p>\n<h3>Instalaci\u00f3n<\/h3>\n<p>Trat\u00e1ndose de servidores Debian la instalaci\u00f3n ha sido tan sencilla como instalar el paquete correspondiente: <a href=\"https:\/\/packages.debian.org\/cgit\">cgit<\/a>.Luego viene la parte de crear un servidor virtual en Apache que ha quedado de la siguiente forma:<\/p>\n<pre class=\"lang:apache decode:true\">&lt;VirtualHost *:443&gt;\r\n   ...\r\n        DocumentRoot \"\/usr\/lib\/cgit\/\"\r\n\r\n        &lt;Directory \"\/usr\/lib\/cgit\/\"&gt;\r\n                AllowOverride None\r\n                Options ExecCGI FollowSymlinks\r\n                Require all granted\r\n        &lt;\/Directory&gt;\r\n\r\n        Alias \/css      \"\/usr\/share\/cgit\"\r\n        Alias \/img      \"\/usr\/share\/cgit\"\r\n        ScriptAlias \/ \"\/usr\/lib\/cgit\/cgit.cgi\/\"\r\n&lt;\/VirtualHost&gt;\r\n<\/pre>\n<p>Y aunque ya se puede poner en marcha necesitamos antes configurarlo para que ciertos valores concuerden con lo que hemos establecido.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>El archivo <code>\/etc\/cgitrc<\/code> tiene su propia p\u00e1gina de manual, con un buen pu\u00f1ado de opciones, pero al final he optado por la m\u00e1s sencilla para m\u00ed:<\/p>\n<pre class=\"lang:default decode:true\"># Pa\u0155ametros web\r\ncss=\/css\/cgit.css\r\nlogo=\/img\/cgit.png\r\nvirtual-root=\/\r\n\r\n# Personalizaci\u00f3n\r\nroot-title=Software personal\r\nroot-desc=Visor de repositorios git\r\n\r\n# Par\u00e1metros GIT: \r\n#    conservar scan-path el \u00faltimo \r\n#\r\nenable-git-config=1\r\nstrict-export=git-daemon-export-ok\r\nscan-path=\/var\/lib\/git\r\n\r\n\r\n# Especiales\r\nenable-commit-graph=1\r\nenable-http-clone=1\r\n<\/pre>\n<p>Es tan simple porque ya he centralizado todos los respositorios que poseo en un directorio concreto que el servidor Apache puede leer; ha bastado entonces con decirle que sea compatible con <em>gitweb<\/em> para que todo resulte de lo m\u00e1s sencillo.<\/p>\n<h3>Repositorios p\u00fablicos y privados<\/h3>\n<p>Con la configuraci\u00f3n anterior si queremos que un repositorio aparezca tenemos que cumplir un requisito: el archivo <code>git-daemon-export-ok<\/code> debe existir en \u00e9l. Simple. O no.<\/p>\n<p>Porque con mi configuraci\u00f3n los repositorios que muestro son del tipo puro (<em>bare<\/em>) -sin copia de trabajo- y cuyos contenidos no cambian cuando efect\u00fao operaciones de escritura desde otras m\u00e1quinas.<\/p>\n<p>Es decir, lo que veo en estos repositorios es lo siguiente:<\/p>\n<pre class=\"lang:default decode:true \">$ ls -la\r\ntotal 40\r\ndrwxr-xr-x   7 git  www-data 4096 nov 25 10:07 .\r\ndrwxr-xr-x  15 git  www-data 4096 nov 20 10:46 ..\r\ndrwxr-xr-x   2 git  www-data 4096 ene 24  2017 branches\r\n-rwxr--r--   1 git  www-data   66 ene 24  2017 config\r\n-rw-r--r--   1 git  www-data   18 ene 24  2017 description\r\n-rw-r--r--   1 root root        0 nov 25 10:07 git-daemon-export-ok\r\n-rw-r--r--   1 git  www-data   23 ene 24  2017 HEAD\r\ndrwxr-xr-x   2 git  www-data 4096 ene 24  2017 hooks\r\ndrwxr-xr-x   2 git  www-data 4096 jun  5 10:49 info\r\ndrwxr-xr-x 245 git  www-data 4096 nov 25 06:54 objects\r\ndrwxr-xr-x   4 git  www-data 4096 ene 24  2017 refs\r\n$<\/pre>\n<p>En este caso el archivo que hace de conmutador s\u00ed que est\u00e1, pero es que he tenido que crearlo a mano.<\/p>\n<p>Si clono una copia de \u00e9l, creo el mismo fichero en el directorio <em>.git<\/em> correspondiente, y env\u00edo los datos al servidor el archivo no aparecer\u00e1.<\/p>\n<p>As\u00ed que, dado que tengo ya <a href=\"https:\/\/esferas.org\/msqlu\/2017\/06\/06\/instrucciones-para-un-repositorio-git\/\">un mecanismo simple<\/a> para gestionar los repositorios v\u00eda <em>ssh<\/em> voy a ampliar su capacidad para hacer p\u00fablicos o no los repositorios.<\/p>\n<p>El programa se llama <em>public<\/em> y tiene el siguiente aspecto:<\/p>\n<pre class=\"lang:sh decode:true\">#!\/bin\/sh\r\n\r\n\r\n# If no project name is given\r\nif [ $# -eq 0 ]\r\nthen\r\n\r\n        # Display usage and stop\r\n        echo \"Usage: public &lt;project&gt; [on|off]\"\r\n        exit 1\r\nelse\r\n        REPO=$1.git\r\n        SW=$2\r\nfi\r\n\r\nif [ ! -d \"$REPO\" ]; then \r\n        echo \"Repository $REPO not found\"\r\n        exit 1\r\nfi \r\n\r\nPUBLIC=$REPO\/git-daemon-export-ok\r\n\r\n# Si no tenemos un par\u00e1metro\r\nif [ \"$SW\" = \"on\" ]; then \r\n        touch $REPO\/git-daemon-export-ok\r\nelif [ \"$SW\" = \"off\" ]; then \r\n        rm -f $REPO\/git-daemon-export-ok\r\nelif [ -n \"$SW\" ]; then \r\n        echo \"Par\u00e1metro err\u00f3neo (on|off): $SW\"\r\n        exit 1  \r\nfi \r\n# Mostramos estado \r\nif [ -e $PUBLIC ]; then \r\n        echo \"Repository $REPO is public\" \r\nelse\r\n        echo \"Repository $REPO is private\"\r\nfi\r\nexit 0\r\n\r\n<\/pre>\n<p>Y puede usarse para<\/p>\n<pre class=\"lang:default decode:true\"># Consultar el estado del repositorio (sin extensi\u00f3n)\r\n$ ssh git@astillas.net public msat\r\nRepository msat.git is public\r\n$\r\n# Ocultarlo \r\n$ ssh git@astillas.net public msat off\r\nRepository msat.git is private\r\n$ \r\n# O hacerlo visible desde cgit\r\n$ ssh git@astillas.net public msat on\r\nRepository msat.git is public\r\n$\r\n<\/pre>\n<p>Y funciona de maravilla &#8230;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Y mira que le he dado vueltas y vueltas a gitweb, el programa que se incluye casi de facto en cualquier instalaci\u00f3n git. Pero nada, han sido quince minutos con cgit y he conseguido todo lo que pretend\u00eda.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[18,733,16,73,689,44],"class_list":["post-2467","post","type-post","status-publish","format-standard","hentry","category-software","tag-administracion-de-sistemas","tag-cgit","tag-desarrollo","tag-git","tag-git-shell","tag-servicios-web"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=2467"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2467\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=2467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=2467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=2467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}