Instalar Spotify en Linux

Introducción


Spotify es una aplicación empleada para la reproducción de música vía streaming disponible en los sistemas operativos Microsoft Windows, Mac OS X, Linux, Windows Phone, Symbian, iOS, Android y BlackBerry. Permite escuchar en modo radio buscando por artista, álbum o listas de reproducción creadas por los propios usuarios.

La empresa, que tiene su sede en Estocolmo, Suecia, ha firmado acuerdos con las discográficas Universal Music, Sony BMG, EMI Music, Hollywood Records y Warner Music entre otras.

ES uno de tantos programas para escuchar música bajo demanda en Internet, pero a mi me encanta. Por eso dejo esta guía tan sencilla para su instalación en Linux (el tema no es nuevo, pero he recogido un poco de información de aquí o allá).

Instalar usando Wine

Instalar Spotify en Linux en Wine es tan sencillo cómo descargar la versión para Windows e instalar wine en nuestro ordenador.

$ sudo apt-get install wine

A continuación ir a la carpeta donde hemos descargado el instalador para Windows de Spotify y ejecutarlo con Wine:

$ wine SpotifySetup.exe

Para ejecutarlo, (aunque seguramente tengamos un enlace directo en el escritorio):

$ wine "C:\Archivos de programa\Spotify\spotify.exe"

Instalar Soptify para Linux nativo (experimental)

Si usamos debian o un sistema similar:

# 1. Añade esta línea a tu lista de repositorios
#    editanddo /etc/apt/sources.list
deb http://repository.spotify.com stable non-free

# 2. Si quieres comprobar los paquetes descargados,
#    tendrás que añadir nuestra clave pública
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 94558F59

# 3. Ejecuta apt-get update

# 4. Instala Spotify
sudo apt-get install spotify-client

Al final, tendremos algo como lo siguiente:

Espero que haya sido de ayuda!

Detectar hardware en Linux (Debian/Ubuntu)

Introducción

Si soís usuarios de Windows y quereís conocer qué componentes tiene vuestro PC disponeís de herramientas muy sencillas como speccy. Pero, ¿y si somos usuarios de Linux?

Pues también disponemos de herramientas para tal efecto. Tanto si somos unos amantes del shell como si preferimos usar un GUI.

lshw

Hardware lister es una herramienta clásica de consola que nos proporciona toda la información disponible de nuestro sistema, por ejemplo:

$ sudo lshw -short
ruta H/W        Dispositivo  Clase       Descripción
=====================================================
                             system      System Product Name
/0                           bus         P5P800-SE
/0/0                         memory      64KiB BIOS
/0/4                         processor   Intel(R) Pentium(R) 4 CPU 3.40GHz
/0/4/5                       memory      16KiB L1 caché
/0/4/6                       memory      1MiB L2 caché
/0/4/1.1                     processor   CPU lógica
/0/4/1.2                     processor   CPU lógica
/0/33                        memory      2GiB Memoria de sistema
/0/33/0                      memory      512MiB DIMM DDR Síncrono
/0/33/1                      memory      512MiB DIMM DDR Síncrono
/0/33/2                      memory      512MiB DIMM DDR Síncrono
/0/33/3                      memory      512MiB DIMM DDR Síncrono
/0/1                         processor   Intel(R) Pentium(R) 4 CPU 3.40GHz
/0/1/1.1                     processor   CPU lógica
/0/1/1.2                     processor   CPU lógica
/0/100                       bridge      82865G/PE/P DRAM Controller/Host-Hub Interface
/0/100/1                     bridge      82865G/PE/P AGP Bridge
/0/100/1/0                   display     RV350 [Radeon 9550/9600/X1050 Series]
/0/100/1/0.1                 display     RV350 [Radeon 9550/9600/X1050 Series] (Secondary)
/0/100/6                     generic     82865G/PE/P Processor to I/O Memory Interface
/0/100/1d                    bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1
/0/100/1d.1                  bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2
/0/100/1d.2                  bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3
/0/100/1d.3                  bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4
/0/100/1d.7                  bus         82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller
/0/100/1e                    bridge      82801 PCI Bridge
/0/100/1e/5     eth0         network     82540EM Gigabit Ethernet Controller
/0/100/1f                    bridge      82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
/0/100/1f.1                  storage     82801EB/ER (ICH5/ICH5R) IDE Controller
/0/100/1f.2                  storage     82801EB (ICH5) SATA Controller
/0/100/1f.3                  bus         82801EB/ER (ICH5/ICH5R) SMBus Controller
/0/100/1f.5                  multimedia  82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
/0/2            scsi1        storage     
/0/2/0.0.0      /dev/cdrom   disk        DVD Writer 400c
/0/3            scsi2        storage     
/0/3/0.0.0      /dev/sda     disk        250GB MAXTOR STM325082
/0/3/0.0.0/1    /dev/sda1    volume      230GiB partición EXT4
/0/3/0.0.0/2    /dev/sda2    volume      2046MiB Extended partition
/0/3/0.0.0/2/5  /dev/sda5    volume      2046MiB Linux swap / Solaris partition

Podemos saber que tipo de memoria RAM, disco duro, tarjeta gráfica, etc tenemos.

sysinfo

Sysinfo es una herramienta basada en GUI muy sencila que muestra información básica.

hardinfo

Hardinfo, es una herramienta muy completa que muestra casi la misma información que lshw en un entorno basado en GTK.
Referencias

  1. Hardware Lister: http://ezix.org/project/wiki/HardwareLiSter

 

Liberar espacio en Debian/Ubuntu

Introducción

¿Tienes el disco duro hasta los topes? ¿Estás pensando en borrar ficheros multimedia o viejos documentos? Pues espera, que quizás te sorprenda una forma sencilla de liberar espacio de tu distribución basada en Debian.

¿Cómo? Si tienes Debian, Ubuntu o similar su sistema de instalar programas (paquetes) se basa en la herramienta apt. Esta herramienta construye una cache durante el tiempo de vida de tu linux para funcionar y llevar el control de actualizaciones, instalaciones, y toda su gestión.

 

Solucinando los problemas

En primer lugar, si quieres saber cuánta caché tiene tu sistema apt, teclea en consola el siguiente comando:

du -sh /var/cache/apt/archives

Para liberar este espacio ejecuta:

sudo apt-get autoclean
sudo apt-get clean
sudo apt-get autoremove

¿Qué hace cada cosa?

sudo apt-get autoclean: Elimina del cache los paquetes .deb con versiones anteriores a los de los programas que tienes instalados.

sudo apt-get clean: Elimina todos los paquetes del cache. El único inconveniente que podría resultar es que si quieres reinstalar un paquete, tienes que volver a descargarlo.

sudo apt-get autoremove: Borra los paquetes huérfanos, o las dependencias que quedan instaladas después de haber instalado una aplicación y luego eliminarla, por lo que ya no son necesarias.

¡Espero que sea de ayuda!

Instalar soporte para Wifi 802.11n en GNU/Linux Debian

Introducción

Recientemente he rescatado un portatil HP 6730s al cual he instalado GNU/Linux Debian (mi distro favorita) y de base no instala los controladores para la wifi.

Bueno, esto no significa ni que existan ni que no que no sea sencillo instalarlos. Sólo que resulta que estos drivers son software non-free de modo que por defecto Debian no lo añade a las fuentes de apt-get. Debemos añadirlo e instalarlo nosotros mismos. Empecemos:

Instalar controladores de nuevos dispositivos wifi (iwlwifi)

El módulo iwlwifi sobre el cual se puede leer más en [1] y [2] ofrece soporte para los siguientes adaptadores LAN:

  • Intel Wireless WiFi 4965AGN (In Debian 7 “Wheezy”, this device is now supported by the iwlegacy driver (iwl4965 module)).
  • Intel Wireless WiFi 5100AGN, 5300AGN, 5350AGN
  • Intel Wireless WiFi 5150AGN
  • Intel WiFi Link 1000BGN
  • Intel 6000 Series WiFi Adapters (6200AGN and 6300AGN)
  • Intel Wireless WiFi Link 6250AGN Adapter
  • Intel 6005 Series WiFi Adapters
  • Intel 6030 Series WiFi Adapters
  • Intel Wireless WiFi Link 6150BGN 2 Adapter
  • Intel 100 Series WiFi Adapters (100BGN and 130BGN)
  • Intel 2000 Series WiFi Adapters

Como he dicho antes, se necesita usar software non-free. Debemos añadir los repositorios non-free a nuestra fuentes apt en el fichero /etc/apt/sources.list para poder instalar el paquete firmware-iwlwifi:

# Debian 7 "Wheezy"
deb http://http.debian.net/debian/ wheezy main contrib non-free

A continuación actualizamos la lista de paquetes disponibles en las fuentes apt e instalamos el firmware:

# apt-get update && apt-get install firmware-iwlwifi

Este modulo se carga automáticamente para los dispositivos compatibles dados en la lista anterior, recargamos el modulo para no reiniciar y configuramos nuestra wifi como toque.

# modprobe -r iwlwifi ; modprobe iwlwifi

A mi en mi HP 6730s me funciona de maravilla.

Referencias

Usando CURL para depurar mensajes HTTP

Introducción

Todo desarrollador WEB que se precie sabe que debe conocer (sino dominar) el protocolo de comunicación HTTP. Sobre este protocolo se basan todas las comunicaciones en la WEB (esto no es cierto del todo ;_)).

En proyectos anteriores he tenido que realizar varías consultas y envío de datos a través del API de Google usando productos como Contacts, Calendar, etc.

Ahora no voy a explicar cómo funciona el protocolo OAtuh [1], pero si diré que es el mecanismo que usa Google para permitir el acceso a sus APIs de forma segura.

Trabajar con este protocolo y manejar mensajes entre mi aplicación y los distintos servidores de Google ha requerido una depuración muy estricta a nivel HTTP y la mejor herramienta que he podido usar es CURL.

La mágia de CURL

Curl [2], es una herramienta muy conocida entre los administradores de sistemas y muy extendida entre los programadores de PHP.

No quiero perderme en detalles, pero vamos ver un ejemplo donde se realiza una petición a un script PHP que contiene el código:

Este código realiza una redirección a http://www.google.com, pero la pregunta es: Entre mi navegador Web y el servidor, ¿qué mensajes HTTP se transmiten? Si utilizamos la opción -v (verbose) podemos ver los mensajes de información del programa (precedidos por *), los mensajes que se envían al servidor (>) y los mensajes que se reciben del servidor (<).

$ curl -v http://webserver/header_location.php
* About to connect() to webserver port 80 (#0)
* Trying 172.x.y.z... connected
* Connected to webserver (172.x.y.z) port 80 (#0)
> GET /header_location.php HTTP/1.1
> User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1
> Host: webserver
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Mon, 04 Nov 2013 17:07:30 GMT
< Server: Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6 PHP/5.2.4-2ubuntu5.27 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g
< X-Powered-By: PHP/5.2.4-2ubuntu5.27
< Location: http://www.google.com/
< Content-Length: 0
< Content-Type: text/html
<
* Connection #0 to host webserver left intact
* Closing connection #0

Bueno, ahora sabemos que este script/página nos envía a google, pero … ¿se puede automatizar el proceso para ver todos los mensajes HTTP hasta que se sirve la página WEB? Sí, usando la opción -L.

Usando un comando cómo:

$ curl -v -L http://webserver/header_location.php

Referencias

  1. Oauth: http://es.wikipedia.org/wiki/OAuth
  2. CURL Homepage: http://curl.haxx.se/

API de Google: Cómo leer en consola un XML del API de Google (u otro XML)

Introducción

Actualmente estoy desarrollando un aplicativo que debe manipular los contactos de una cuanta de Google Apps. Para ello uso el API de Google Contacts [1], Por defecto los mensajes que envía y recibe Google a través de su servicio (REST) son en XML. Como programador no supone un problema manipular un XML, pero si queremos depurar o hacer pruebas en consola leer un XML sin espacios, saltos de línea o tabulados puede ser especialmente engorroso.

Una solución es usar una herramienta cómo indent, pero para XML.Esta herramienta es tidy.

Instalar tidy en Debian/Ubuntu y cómo usarlo

Para instalar Tidy sólo hay que teclear:

sudo apt-get install tidy

Un ejemplo de uso sería, dado un fichero entrada.xml sin formatear, sin saltos de línea ni espacios si queremos guardarlo en un fichero salida.xml preparado para leerlo seres humanos podríamos hacerlo con la secuencia de comandos:

cat entrada.xml | tidy -utf8 -xml -w 255 -i -c -q -asxml > salida.xml

Para más opciones de tidy, leer su página de manual en la referencia [3].

Ejemplo de uso con el API de Google

Visto el apartado anterior y los ejemplos de uso visto en el enlace [1] podemos obtener la información de un contacto de nuestra libreta de contactos de Google en XML con el comando:

$ curl -H "Authorization: Bearer -------Your_OAuth_Access_Token_Here-----------------" https://www.google.com/m8/feeds/contacts/default/full?max-results=1 |tidy -utf8 -xml -w 255 -i -c -q -asxml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2799    0  2799    0     0   6327      0 --:--:-- --:--:-- --:--:-- 87545
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005'>
  <id>jose.perez.martinez@gmail.com</id>
  <updated>2013-09-27T10:14:56.316Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' />
  <title type='text'>José Pérez Martínez's Contacts</title>
  <link rel='alternate' type='text/html' href='http://www.google.com/' />
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full' />
  <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full' />
  <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full/batch' />
  <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full?max-results=1' />
  <link rel='next' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full?start-index=2&max-results=1' />
  <author>
    <name>José Pérez Martínez</name>
    <email>jose.perez.martinez@gmail.com</email>
  </author>
  <generator version='1.0' uri='http://www.google.com/m8/feeds'>Contacts</generator>
  <openSearch:totalResults>616</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1</openSearch:itemsPerPage>
  <entry>
    <id>http://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/base/0</id>
    <updated>2011-02-23T13:06:29.313Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' />
    <title type='text'>Alejandro Soler</title>
    <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/jose.perez.martinez%40gmail.com/0/jLnPaGKk4gRrJJff1sWXhg' />
    <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/jose.perez.martinez%40gmail.com/0' />
    <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full/0' />
    <link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full/0/1298466389313000' />
    <gd:email rel='http://schemas.google.com/g/2005#other' address='kirth.asf@gmail.com' primary='true' />
  </entry>
</feed>

Notad que la gestión del token para obtener esta información es responsabilidad del usuario. PAra saber más leed la referencia [2]

Postscriptum: Más adelante escribiré una entrada sobre el API de Google y el protocolo de autorización OAuth2.

Referencias

  1. Google Contacts API version 3.0:https://developers.google.com/google-apps/contacts/v3/?csw=1
  2. Using OAuth 2.0 for Web Server Applications: target=”_blank”>https://developers.google.com/accounts/docs/OAuth2WebServer
  3. Tidy man page: http://tidy.sourceforge.net/docs/tidy_man.html

CHMOD: Cambiar los permisos de todos los directorios o sólo de ficheros

Hoy me he instaldo el Android Studio para cacharrear un par de aplicaciones que estoy probando. Como uso linux me he descargado el fichero TGZ del servidor de Google. Google sugiere que lo descomprimas donde quieras, pero claro a mi me gusta ser ordenado.

Podrías ponerlo en mi carpeta $HOME pero no creo que se muy correcto. Prefiero situarlo en el directorio /opt, claro debo descomprimirlo y a todos los directorios les doy permiso 775. ¿Cómo hacerlo de un plumazo? He pensado que es una buena ocasión para poner un par de ejemplos.

Modificar los permisos de los ficheros según su tipo:

  • Directorios:
    find /home/pruebas -type d -exec chmod -R 775 {} \;
  • Ficheros regulares (del mismo modo, pero …):
    find /home/pruebas -type f -exec chmod -R 775 {} \;

Para más opciones leed la referencia que adjunto.

Referencias

Página de manual del comando find: http://unixhelp.ed.ac.uk/CGI/man-cgi?find

Test de velocidad de disco duro

Hace un tiempo que he detectado que las prestaciones de mi disco duro han bajado. Además de buscar fallos físicos he querido ver la tasa de velocidad real del mismo. Mediante el siguiente comando:

time dd if=/dev/zero of=TEST bs=4k count=512000

Podemos obtener un informe sobre el funcionamiento del disco, en mi caso:

$ time dd if=/dev/zero of=TEST bs=4k count=512000
512000+0 registros leídos
512000+0 registros escritos
2097152000 bytes (2,1 GB) copiados, 14,8617 s, 141 MB/s

real	0m14.873s
user	0m0.140s
sys	0m5.280s

Así, en el caso de mi disco duro su velocidad en el test ha sido de 141 MB/s.

Referencias

Estándar IEEE 754 para la representación en coma flotante

Introducción

La aritmética en coma flotante ha sido objeto de polémicas y múltiples formas de implementarla (quizás más adelante escriba una entrada sobre los métodos más extendidos) pero fue en 1985 cuando el IEEE [1] terminó y publicó un documento donde estandarizaba la forma de representar los números en punto flotante y cómo realizar las operaciones aritméticas. Esta norma se conoce como IEEE 754, y ha sido un fuerte dolor de cabeza para más de un estudiante de Informática en su primer año.

A día de hoy se considera el estándar de facto en todos los ordenadores personales. Pero, ¿cómo funciona exactamente?

Representación

Simplificando a dos modalidades la norma define dos resoluciones posibles para los números. Véase la figura 1. Simple precisión (32 bits) y doble precisión (64 bits).

Formato de representación para el estándar IEEE 754 (en simple y doble precisión). Imagen gracias a IBM.

Figura 1: Formato de representación para el estándar IEEE 754 (en simple y doble precisión). Imagen gracias a IBM.

Matemáticamente, ¿cómo funciona este sistema de representación? Dado un número real “x” será representado como su signo, multiplicado por el valor de su mantisa (número normalizado tipo notación científica) y multiplicado además por la base de representación  elavada al valor del exponente sesgado.

(1)
(2)

Hablando en términos de representación numérica en computadores y tomando como ejemplo el caso de simple precisión donde se reserva un bit para el signo, 8 bits para el exponente y 23 bits para la matisa tenemos:

  • Bit de signo: 0 positivo / 1 negativo
  • El exponente se representa sesgado al valor dado por la formula (2). En el caso de simple presición sería: exps = 2^(8-1)-1=2^7-1=127.
  • La mantisa en binario es un número del tipo 1.xxxxx donde el primer 1 no fraccionario se asume y no se representa dentro del formato.
Más adelante realizaremos algún ejemplo práctico, veremos números especiales como NaN , Infinito o el cero. De momento dejo unas curiosidades.

Curiosidades

Número más grande representable:

Número más pequeño representable (positivo y no cero):

Tendiendo a cero hay una serie de números reales no representables:

Referencias

  1. Instituto de Ingenieros Eléctricos y Electrónicos (IEEE o IE3): http://www.ieee.org/index.html
  2. Grupo del IEEE sobre la norma 754: http://grouper.ieee.org/groups/754/
  3. Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic: http://www.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
  4. Conversor entre decimal <–> IEEE754: http://www.h-schmidt.net/FloatConverter/
  5. Conversor entre decimal <–> IEEE754: http://users.minet.uni-jena.de/~sack/SS04/download/IEEE-754.html
  6. http://es.wikipedia.org/wiki/Intel_8087
  7. An Interview with the Old Man of Floating-Point; http://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html
  8. Transparencias muy ilustrativas: http://webdelprofesor.ula.ve/ingenieria/gilberto/paralela/09_AritmeticaPuntoFlotante.pdf

GIT: Repositorios remotos y desarrollo distribuido

Introducción

Hace una semana publiqué una entrada introduciendo el sistema de control de versiones GIT. Ayer añadí otra entrada donde dí unos primeros pasos a git. Hoy después de unas horas de trabajo y recopilar ejemplos basados en mi trabajo diario ha llegado el momento de escribir sobre los repositorio remotos.

Repositorios remotos

Veamos un caso imaginario muy útil. ¿Cual es nuestro escenario?

  • Trabajamos 2+ desarrolladores en un proyecto común.
  • Disponemos de un equipo de trabajo donde día a día actualizamos un repositorio GIT local (a nuestro equipo) para controlar la evolución de nuestro trabajo.
  • Tenemos algún colega/compañero que trabaja desde su casa y también tiene su equipo donde controla su trabajo diario con su instalación local de GIT.
  • Además, cabe la posibilidad que nosotros mismos tengamos en casa otro equipo desde el cual podemos trabajar otras horitas en casa.
La primera pregunta, ¿cómo organizar este lío de tantas personas trabajando en lo mismo sin que haya peligro de sobrescribir uno el trabajo del otro?
Escenario de ejemplo: Repositorios GIT remotos y varios desarolladores
Figura 1: Escenario de ejemplo. Repositorios GIT remotos y varios desarolladores

Bueno, pues ya que hablamos de control de versiones lo primero que entra en juego es un servidor donde crear un/unos repositorio/s GIT donde cada programador realiza un commit de su trabajo y así el resto de colegas estén al tanto de sus cambios (a parte habría que hablar de ciertas políticas o protocolos de trabajo sobre cómo repartir el trabajo pero de eso no hablaremos ahora).

Crear el repositorio en el servidor remoto

Vamos a suponer que disponemos de un servidor con nombre repositorios.net. Este servidor está disponible en Internet o en nuestra red local de trabajo (suponemos una máquina Unix). Hemos creado un usuario llamado git cuya carpeta de trabajo en /home/git. Queremos crear el repositorio para el proyecto ejemplo.

git@repositorios.net:~/$ mkdir ejemplo.git
git@repositorios.net:~/ejemplo.git$ git --bare init
Initialized empty Git repository in /home/git/ejemplo.git/

Ya disponemos de un repositorio (contendor) en crudo donde depositar nuestros commits locales o desde donde descargar las actualizaciones del proyecto realizadas por otros usuarios.

Para poder acceder, desde nuestro directorio de trabajo debemos tener un repositorio git (Vamos a suponer una máquina Windows):

$ git init
Initialized empty Git repository in c:/Workspace/proyecto/.git/
$ git add .
$ git -a -m "Inicio proyecto GIT"

31 files changed, 5873 insertions(+), 0 deletions(-)
create mode 100644 .gitignore
create mode 100644 .project
...
Counting objects: 38, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (37/37), done.
Writing objects: 100% (38/38), 82.87 KiB, done.
Total 38 (delta 1), reused 0 (delta 0)
To ssh://git@repositorios.net/home/git/proyecto.git
* [new branch] master > master

Otro usuario, por ejemplo en un equipo Linux, podría crear su copia de repositorio del siguiente modo:

jperez@jperez-debian:~/gitsample$ git init
Initialized empty Git repository in /home/user/gitsample/.git/
jperez@jperez-debian:~/Desktop/borrar/gitsample$ git remote add Matrix ssh://git@central.ovalus.com:101/home/git/sagema.git
jperez@jperez-debian:~/Desktop/borrar/gitsample$ git pull Matrix
git@central.ovalus.com's password:
remote: Counting objects: 38, done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 38 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (38/38), done.
From ssh://central.ovalus.com:101/home/git/sagema
* [new branch] master -> Matrix/master
You asked to pull from the remote 'Matrix', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
jperez@jperez-debian:~/Desktop/borrar/gitsample$ git pull Matrix master
git@central.ovalus.com's password:
From ssh://central.ovalus.com:101/home/git/sagema
* branch master -> FETCH_HEAD
jperez@jperez-debian:~/Desktop/borrar/gitsample$ ls
css geo.html google848132b663ce25f4.html index.htm js menu.html responsive robots.txt template.php
jperez@jperez-debian:~/Desktop/borrar/gitsample$ ls -lha
total 76K
drwxr-xr-x 6 jperez jperez 4,0K jun 24 17:05 .
drwxrwxr-x 3 jperez jperez 4,0K jun 24 17:02 ..
drwxr-xr-x 3 jperez jperez 4,0K jun 24 17:05 css
-rw-r--r-- 1 jperez jperez 881 jun 24 17:05 geo.html
drwxr-xr-x 8 jperez jperez 4,0K jun 24 17:05 .git
-rw-r--r-- 1 jperez jperez 46 jun 24 17:05 .gitignore
-rw-r--r-- 1 jperez jperez 53 jun 24 17:05 google848132b663ce25f4.html
-rw-r--r-- 1 jperez jperez 4,1K jun 24 17:05 index.htm
drwxr-xr-x 3 jperez jperez 4,0K jun 24 17:05 js
-rw-r--r-- 1 jperez jperez 8,6K jun 24 17:05 menu.html
-rw-r--r-- 1 jperez jperez 599 jun 24 17:05 .project
drwxr-xr-x 4 jperez jperez 4,0K jun 24 17:05 responsive
-rw-r--r-- 1 jperez jperez 61 jun 24 17:05 robots.txt
-rw-r--r-- 1 jperez jperez 12K jun 24 17:05 template.php
jperez@jperez-debian:~/Desktop/borrar/gitsample$

Apéndice 1: .gitignore

**.gitignore** es un fichero especial para GIT. Se debe situar en la carpeta raíz del repositorio. Contiene los ficheros que no queremos que añada GIT al repositorio (de modo que no serán tenidos en cuenta).

¿Esto es útil? Ya lo creo. Supongamos que trabajamos en un proyecto WEB. Seguramente no querremos añadir los ficheros de imágenes, PDS (photoshop), etc.Si se tratase de un proyecto C++ en Linux seguramente sólo querríamos guardar los ficheros .c y .h. De modo que no querremos guardar los ficheros objeto (.o). En definitiva tratamos de evitar cualquier recurso que no sea código fuente o texto.

Un ejemplo, el caso del proyecto C/C++, no queremos que se tengan en cuenta los ficheros *.o, el directorio tmp (que se usa para almacenar datos temporales de compilación) y otras carpeta que se llama “resources”.

*.o
tmp/
resources/

Considero este tema muy interesante, recomiendo leer la entrada [2].

Referencias

  1. Trabajando con repositorios remotos (Doc oficial de GIT) : http://git-scm.com/book/es/Fundamentos-de-Git-Trabajando-con-repositorios-remotos
  2. Ignorando archivos en GIT: http://es.gitready.com/beginner/2009/01/19/ignoring-files.html