<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -388,3 +388,45 @@ directories are expendable, then delete them mercilessly with:
   $ git clean -f -d
 
 Next time, that pesky command will work!
+
+=== Improve Your Public Image ===
+
+Stupid mistakes abound in the histories of many of my projects. The most
+frightening are missing files due to forgetting to run *git add*. Luckily I
+have yet to lose crucial data though accidental omission because I rarely
+delete original working directories. I typically notice the error a few commits
+later, so the only damage is a bit of missing history and a sheepish admission
+of guilt.
+
+I also regularly commit (literally and git-erally) the lesser transgression of
+trailing whitespace. Though harmless, I wish these also never appeared on the
+public record.
+
+In addition, though unscathed so far, I worry about leaving merge conflicts
+unresolved. Usually I catch them when I build a project, but there are some
+cases this can overlook.
+
+If only I had bought idiot insurance by using a _hook_ to alert me about these
+problems:
+
+ $ chmod +x .git/hooks/pre-commit
+
+Now Git aborts a commit if useless whitespace or unresolved merge conflicts are
+detected.
+
+For a C project, add the following to the beginning of the *pre-commit* hook to
+warn about forgotten files:
+
+ if git ls-files -o | grep '\.[ch]$'; then
+   echo FAIL! Looks like you forgot to add some source files.
+   exit 1
+ fi
+
+Several git operations support hooks; see *git help hooks*. One can write hooks
+to complain about spelling mistakes in commit messages, add new files, indent
+paragraphs, complain about lines over 80 characters long, add an entry to a
+webpage, play a sound, and so on.
+
+In fact, we encountered the *post-update* hook while discussing Git over
+HTTP: in this case, after the repository is updated, a hook script
+maintains a few files Git needs for non-native communication.</diff>
      <filename>en/grandmaster.txt</filename>
    </modified>
    <modified>
      <diff>@@ -181,11 +181,12 @@ will always contain at least one line identifying a parent commit.
 
 There's little else to say. We have just exposed the secret behind Git's
 powers. It seems too simple: it looks like you could mix together a few shell
-scripts and add a dash of C code to cook up the above in a matter of hours. In
-fact, this accurately describes the earliest versions of Git. Nonetheless,
-apart from ingenious packing tricks to save space, and ingenious indexing
-tricks to save time, we now know how Git deftly changes a filesystem into a
-database perfect for version control.
+scripts and add a dash of C code to cook up the above in a matter of hours,
+mixing in lock files and fsyncs for robustness. In fact, this accurately
+describes the earliest versions of Git. Nonetheless, apart from ingenious
+packing tricks to save space, and ingenious indexing tricks to save time, we
+now know how Git deftly changes a filesystem into a database perfect for
+version control.
 
 For example, if any file within the object database is corrupted by a disk
 error, then its hash will no longer match, alerting us to the problem. By</diff>
      <filename>en/secrets.txt</filename>
    </modified>
    <modified>
      <diff>@@ -59,7 +59,7 @@ te llevar&#225; al presente. Tambi&#233;n, para que Git no se queje, siempre haz un comm
 
 Para retomar la analog&#237;a de los videojuegos:
 
-- *`git reset \--hard`*: carga un juego viejo y borra todos los que son mas nuevos que el que acabas de cargar. 
+- *`git reset \--hard`*: carga un juego viejo y borra todos los que son mas nuevos que el que acabas de cargar.
 
 - *`git checkout`*: carga un juego viejo, pero si contin&#250;as jugando, el estado del juego se desviar&#225; de los juegos que salvaste la primera vez. Cualquierpartido nuevo que guardes, terminar&#225; en una branch separada, representando la realidad alternativa a la que entraste. &lt;&lt;branch,Luego nos encargaremos de esto&gt;&gt;
 
@@ -166,7 +166,7 @@ Siendo A, B, C, y D cuatro commits sucesivos, donde B es el mismo que A pero con
 Hay por lo menos tres soluciones. Asumiendo que estamos en D:
 
   1. La diferencia entre A y B son los archivos eliminados. Podemos crear un patch representando esta diferencia y aplicarlo:
-  
+
    $ git diff B A | git apply
 
   2. Como en A tenemos los archivos guardados, podemos recuperarlos :</diff>
      <filename>es/basic.txt</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 El hacer branches (ramificar) y merges (unir) de manera instant&#225;nea, son dos de las prestaciones m&#225;s letales de Git.
 
 *Problema*: Factores externos necesitan inevitablemente de cambios de contexto.
-Un bug severo se manifiesta en la &#250;ltima versi&#243;n sin previo aviso. El plazo para 
+Un bug severo se manifiesta en la &#250;ltima versi&#243;n sin previo aviso. El plazo para
 alguna prestaci&#243;n se acorta. Un desarrollador que tiene que ayudar en una secci&#243;n indispensable
 del proyecto est&#225; por tomar licencia. En cualquier caso, debes soltar abruptamente lo que est&#225;s haciendo
 y enfocarte en una tarea completamente diferente.
@@ -51,7 +51,7 @@ Supongamos que est&#225;s trabajando en alguna prestaci&#243;n, y que por alguna raz&#243;n,
  $ git commit -a
  $ git checkout SHA1_HASH
 
-Ahora puedes agregar cualquier c&#243;digo temporal horrible por todos lados. 
+Ahora puedes agregar cualquier c&#243;digo temporal horrible por todos lados.
 Incluso puedes hacer commit de estos cambios. Cuando termines,
 
  $ git checkout master
@@ -91,7 +91,7 @@ Algunos proyectos requieren que tu c&#243;digo sea evaluado antes de que puedas subi
 
 &#191;Que pasa si la segunda parte no puede ser escrita hasta que la primera sea aprobada y subida? En muchos sistemas de control de versiones, deber&#237;as enviar primero el c&#243;digo a los evaluadores, y luego esperar hasta que est&#233; aprobado antes de empezar con la segunda parte.
 
-En realidad, eso no es del todo cierto, pero en estos sistemas, editar la Parte II antes de subir la Parte I involucra sufrimiento e infortunio. En Git, los branches y merges son indoloros (un termino t&#233;cnico que significa r&#225;pidos y locales). Entonces, luego de que hayas hecho commit de la primera parte y la hayas enviado a ser revisada: 
+En realidad, eso no es del todo cierto, pero en estos sistemas, editar la Parte II antes de subir la Parte I involucra sufrimiento e infortunio. En Git, los branches y merges son indoloros (un termino t&#233;cnico que significa r&#225;pidos y locales). Entonces, luego de que hayas hecho commit de la primera parte y la hayas enviado a ser revisada:
 
  $ git checkout -b parte2
 
@@ -162,7 +162,7 @@ para salvar el estado actual y permitirte saltar a un estado anterior
 para solucionar un bug de alta prioridad o algo.
 
 Es an&#225;logo a cambiar el canal de la TV temporalmente, para ver que otra
-cosa est&#225;n dando. Pero en lugar de apretar un par de botones, tienes que 
+cosa est&#225;n dando. Pero en lugar de apretar un par de botones, tienes que
 crear, hacer checkout y eliminar branches y commits temporales. Por suerte,
 Git tiene un aatajo que es tan conveniente como un control remoto de TV:
 </diff>
      <filename>es/branch.txt</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@ Los sistemas de control de versiones no son diferentes. Todos tienen lindas inte
 === Control Distribu&#237;do ===
 
 Ahora imagina un juego muy dif&#237;cil. Tan dif&#237;cil para terminar, que muchos jugadores experientes alrededor del mundo deciden agruparse e intercambiar sus juegos guardados para intentar terminarlo. Los &quot;Speedruns&quot; son ejemplos de la vida real: los jugadores se especializan en diferents niveles del mismo juego y colaboran para lograr resultados sorprendentes.
-&#191;C&#243;mo armar&#237;as un sistema para que puedan descargar las partidas de los otros de manera simple? &#191;Y para que suban las nuevas? 
+&#191;C&#243;mo armar&#237;as un sistema para que puedan descargar las partidas de los otros de manera simple? &#191;Y para que suban las nuevas?
 
 Antes, cada proyecto usaba un control de versiones centralizado. Un servidor en alg&#250;n lado conten&#237;a todos los juegos salvados. Nadie m&#225;s los ten&#237;a. Cada jugador ten&#237;a a lo sumo un un par de juegos guardados en su m&#225;quina. Cuando un jugador quer&#237;a progresar, obten&#237;a la &#250;ltima versi&#243;n del servidor principal, jugaba un rato, guardaba y volv&#237;a a subir al servidor para que todos los dem&#225;s pudieran usarlo.
 
@@ -39,7 +39,7 @@ Esta operaci&#243;n inicial de clonado, puede ser cara, especialmente si el historia
 
 Una creencia popular err&#243;nea es que los sistemas distribu&#237;dos son poco apropiados para proyectos que requieren un repositorio central oficial. Nada podr&#237;a estar m&#225;s lejos de la verdad. Fotografiar a alguien no hace que su alma sea robada, clonar el repositorio central no disminuye su importancia.
 
-Una buena aproximaci&#243;n inicial, es que cualquier cosa que se puede hacer con un sistema de control de versiones centralizado, se puede hacer mejor con un sistema de versiones distribu&#237;do que est&#233; bien dise&#241;ado. Los recursos de red son simplemente m&#225;s costosos que los recursos locales. Aunque luego veremos que hay algunas desventajas para un sistema distribu&#237;do, hay menos probabilidad de hacer comparaciones erroneas al tener esto en cuenta. 
+Una buena aproximaci&#243;n inicial, es que cualquier cosa que se puede hacer con un sistema de control de versiones centralizado, se puede hacer mejor con un sistema de versiones distribu&#237;do que est&#233; bien dise&#241;ado. Los recursos de red son simplemente m&#225;s costosos que los recursos locales. Aunque luego veremos que hay algunas desventajas para un sistema distribu&#237;do, hay menos probabilidad de hacer comparaciones erroneas al tener esto en cuenta.
 
 Un proyecto peque&#241;o, puede necesitar solo una fracci&#243;n de de las caracter&#237;sticas que un sistema as&#237; ofrece. Pero, &#191;usar&#237;as n&#250;meros romanos si solo necesitas usar n&#250;meros peque&#241;os?. Adem&#225;s, tu proyecto puede crecer m&#225;s all&#225; de tus expectativas originales. Usar Git desde el comienzo, es como llevar una navaja suiza, aunque solo pretendas usarla para abrir botellas. El d&#237;a que necesites desesperadamente un destornillador, vas a agradecer el tener m&#225;s que un simple destapador.
 </diff>
      <filename>es/intro.txt</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,7 @@ Estoy muy agradecido por todos los que me han dado apoyo y elogios. Me gustar&#237;a
 
 Esta gu&#237;a se publica bajo la http://www.gnu.org/licenses/gpl-3.0.html[GNU General Public License versi&#243;n 3]. Naturalmente, los fuentes se guardan en un repositorio Git, y pueden ser obtenidos escribiendo:
 
- $ git clone git://repo.or.cz/gitmagic.git  # Crea el directorio &quot;gitmagic&quot;. 
+ $ git clone git://repo.or.cz/gitmagic.git  # Crea el directorio &quot;gitmagic&quot;.
 
 Ver debajo por otros mirrors.
 
@@ -36,4 +36,4 @@ Ver debajo por otros mirrors.
  - http://repo.or.cz/[http://repo.or.cz/] hospeda proyectos gratuitos,
 http://repo.or.cz/w/gitmagic.git[incluyendo esta gu&#237;a].
  - http://gitorious.org/[http://gitorious.org/] es un sitio que apunta al hosting de proyectos open-source.
- - http://github.com/[http://github.com/] hospeda proyectos open-source gratis, http://github.com/blynn/gitmagic/tree/master[incluyendo esta gu&#237;a], y proyectos privados por una cuota. 
+ - http://github.com/[http://github.com/] hospeda proyectos open-source gratis, http://github.com/blynn/gitmagic/tree/master[incluyendo esta gu&#237;a], y proyectos privados por una cuota.</diff>
      <filename>es/preface.txt</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8ccfe9f31153016e3cdb81c035eb06e186def080</id>
    </parent>
  </parents>
  <author>
    <name>Ben Lynn</name>
    <email>benlynn@gmail.com</email>
  </author>
  <url>http://github.com/blynn/gitmagic/commit/f6bc35cb239b3b9845ab5718b8fe49eee711bdb1</url>
  <id>f6bc35cb239b3b9845ab5718b8fe49eee711bdb1</id>
  <committed-date>2009-06-25T01:51:08-07:00</committed-date>
  <authored-date>2009-06-25T01:45:46-07:00</authored-date>
  <message>Wrote about hooks.

Removed trailing whitespace.</message>
  <tree>1f8267fdeec2b4e35a906008dd4892a00a5cd7db</tree>
  <committer>
    <name>Ben Lynn</name>
    <email>benlynn@gmail.com</email>
  </committer>
</commit>
