Git development
 help / color / mirror / Atom feed
* Using "git log" to find the files patched at the same time as a named  file
From: Zack Brown @ 2010-02-03 20:38 UTC (permalink / raw)
  To: git

Hi folks,

If I have a filename I'm interested in, and I want to find other files
that have been modified in the same commits that modified the file I'm
interested in, how could I do that with git?

If I give the command
$ git log --name-only
then the bottom of each log entry will list all the files that were
modified by that commit. That's basically what I want, except that the
command will list all log entries, not just the ones that modified the
file I'm interested in.

If I give the command
$ git log --name-only fs/fuse/file.c
then the bottom of each log entry only lists fs/fuse/file.c, even if
the very same commit showed up in the output from the previous command
with multiple files in addition to that one. In other words, the "git
log --name-only fs/fuse/file.c" command will only list fs/fuse/file.c
as being changed, in commits that I know changed more than just that
one file.

Is there a git command that will run in roughly the same amount of
time as the ones given above (i.e. with only a single invocation of
git), but that will only output the commits that affected the file I'm
interested in, and that will also list any other files changed in
those same commits?

Many thanks,
Zack

-- 
Zack Brown

^ permalink raw reply

* Re: git-mv redux: there must be something else going on
From: Ron Garret @ 2010-02-03 20:31 UTC (permalink / raw)
  To: git
In-Reply-To: <ron1-34F9C6.12273203022010@news.gmane.org>

In article <ron1-34F9C6.12273203022010@news.gmane.org>,
 Ron Garret <ron1@flownet.com> wrote:

> In article <alpine.LFD.2.00.1002031436490.1681@xanadu.home>,
>  Nicolas Pitre <nico@fluxnic.net> wrote:
> 
> > On Wed, 3 Feb 2010, Ron Garret wrote:
> > 
> > > So... how *does* git decide when two blobs are different blobs and when 
> > > they are the same blob with mods?  I asked this question before and was 
> > > pointed to the diffcore docs, but that didn't really clear things up.  
> > > That just describes all the different ways git can do diffs, not the 
> > > actual heuristics that git uses to track content.
> > 
> > Yes, those same heuristics are used to make the decision.
> > 
> > |The second transformation in the chain is diffcore-break, and is
> > |controlled by the -B option to the 'git diff-{asterisk}' commands.  
> > |This is used to detect a filepair that represents "complete rewrite" 
> > |and break such filepair into two filepairs that represent delete and
> > |create.
> > |[...]
> > 
> > |This transformation is used to detect renames and copies, and is
> > |controlled by the -M option (to detect renames) and the -C option
> > |(to detect copies as well) to the 'git diff-{asterisk}' commands.  
> > |[...]
> > 
> > Note that you may use the -B, -C, -M and --find-copies-harder arguments 
> > with log as well as diff commands even if there is no actual diff 
> > output.  So the explanation is really in that document even if simple 
> > rename detection is concerned only by a fraction of what is said there.
> > 
> > And Git can detect copied files too.
> > 
> > Those semantics are not stored in the repository so they can be improved 
> > or even changed after the facts.
> 
> OK, on closer reading I see that the information is there, but it's well 
> hidden :-)  (For example, the -M option takes an optional numerical 
> argument so you can tweak how much similarity is needed to be considered 
> a move.  But the docs for git log don't mention this.  It's buried deep 
> in the git diffcore docs.  But yes, it's there.)
> 
> So I think I'm beginning to understand how this works, but that leads me 
> to another question: it seems to me that there are potential screw cases 
> for this purely content-based system of tracking files.  For example, 
> suppose I have a directory full of sample config files, all of which are 
> similar to each other.  Will that cause diffcore to get confused?
> 
> Feel free to treat that as a rhetorical question because obviously I can 
> (and probably should) get the answer by trying it.

Actually, I think the answer is in Avery's post in another branch of 
this thread.

rg

^ permalink raw reply

* Re: git-mv redux: there must be something else going on
From: Avery Pennarun @ 2010-02-03 20:40 UTC (permalink / raw)
  To: Ron Garret; +Cc: git
In-Reply-To: <ron1-34F9C6.12273203022010@news.gmane.org>

On Wed, Feb 3, 2010 at 3:27 PM, Ron Garret <ron1@flownet.com> wrote:
> So I think I'm beginning to understand how this works, but that leads me
> to another question: it seems to me that there are potential screw cases
> for this purely content-based system of tracking files.  For example,
> suppose I have a directory full of sample config files, all of which are
> similar to each other.  Will that cause diffcore to get confused?

Cases like that are always confusing, even to humans.  Person A
renames X to Y, but at the same time creates Z which is almost
identical.  Person B patches X, then merges in person A's changes.

What do you expect to happen?  Should Y be changed, because that's the
file X was moved from?  Or should we change Z, because it's almost the
same content anyway?  Or maybe we should change both, since a change
to the old X is probably intended to affect the copied *content* that
ended up in both Y and Z?

Simply storing whether person A has renamed vs. copied vs. added a
file makes the answer to the "what do you expect to happen" question
more obvious, but fails to answer the "what *should* happen" question.
 Thus it's more of a distraction than a feature.  It took a while for
me to accept this, but once I did, I realized that git's behaviour has
still never caused me a problem in real life, despite repeated file
renames and complicated merges.

In contrast, svn's explicit rename tracking has shot me in the foot
numerous times.  (svn remembers when I delete file X and then
subsequently re-add it with the same content.  So if I merge in
someone's change to the *old* file X, it barfs because omg omg that's
a totally different file X and it can't possibly figure out what to
do.  Gee, thanks.  It's also hopelessly incompetent at handling
"renames" in which a newbie developer didn't know to use svn mv, but
instead used svn rm, mv, and svn add.)

Have fun,

Avery

^ permalink raw reply

* Re: extra headers in commit objects
From: Junio C Hamano @ 2010-02-03 20:42 UTC (permalink / raw)
  To: Shawn O. Pearce; +Cc: demerphq, Nicolas Pitre, git
In-Reply-To: <20100203192612.GD14799@spearce.org>

"Shawn O. Pearce" <spearce@spearce.org> writes:

> As I understand it, the current stance is:
>
> 1) A compliant Git implementation ignores any headers it doesn't
>    recognize that appear *after* the optional "encoding" header.

I first read the above to mean that you need to add encoding if you want
to throw in other garbage.

I would say "*after* the mandatory 'tree', 'parent' (0 or more), 'author',
and 'committer' headers that must appear in this order", for clarity.

> 2) A compliant Git implementation does not produce any additional
>    headers in a commit object, because other implementations cannot
>    perform any machine based reasoning on them.
>
> 3) All implementations would (eventually) treat all headers equally,
>    that is they all understand what author, committer, encoding are
>    and process them the same way.  Any new headers should equally
>    be fully cross-implementation.

These are very important points.

In your made-up example you added "bug" (presumably to mean "fixes this
bug") and "message-id" ("am-ed from this message").  The latter might make
sense, but the former does not belong to the header, as it is not a
statement of the fact.

Forcing people to say "this fixes" at the commit time means you do not
allow mistakes---it may turn out to be an incorrect or non fix later.
When you are amending the commit to say "this does not really fix it", you
would want to lose the old "bug" header, but you would want to keep the
"message-id" one.  There simply is not enough hint as to which ones must
be carried across amending in the "we allow people to randomly throw extra
headers into the commit object" model.  It is not a model--it is chaos.

Also it wouldn't be obvious to other people what got changed while
comparing two commits (before and after the amend) if the information is
hidden in the header.  The right place for that kind of information is in
the log message (if the nature of the information is for everybody to see)
or in notes.

Another major difference between extra random headers and notes is that
the former changes the commit's object name, and if it is due to "random
headers", it means you are breaking the object model for no good reason.

Introducing extra headers needs to be done _very_ carefully after thinking
things through, judging the pros and cons.  Even though we kept the format
open to allow us to extend the format to add essential statement of fact
that we can make at the commit time (e.g. "encoding"), I do not foresee us
adding any official extra headers in near future.

^ permalink raw reply

* Re: git-mv redux: there must be something else going on
From: Nicolas Pitre @ 2010-02-03 20:44 UTC (permalink / raw)
  To: Ron Garret; +Cc: git
In-Reply-To: <ron1-34F9C6.12273203022010@news.gmane.org>

On Wed, 3 Feb 2010, Ron Garret wrote:

> OK, on closer reading I see that the information is there, but it's well 
> hidden :-)  (For example, the -M option takes an optional numerical 
> argument so you can tweak how much similarity is needed to be considered 
> a move.  But the docs for git log don't mention this.  It's buried deep 
> in the git diffcore docs.  But yes, it's there.)

The doc is indeed not perfect.  Probably the -M option and friends could 
be listed again in the git-log and git-diff pages with a more casual 
explanation.

> So I think I'm beginning to understand how this works, but that leads me 
> to another question: it seems to me that there are potential screw cases 
> for this purely content-based system of tracking files.  For example, 
> suppose I have a directory full of sample config files, all of which are 
> similar to each other.  Will that cause diffcore to get confused?

There are ways to fool the heuristics indeed.  But overall it is still 
more reliable than manually having to record the rename into the tool 
since humans are known for screwing these things up more often than 
machines.  And again the heuristics can be modified after the fact if 
needed, unlike the manually recorded false renames (or lack of rename 
record) which will remain wrong unless another manual correction is 
applied to the database.


Nicolas

^ permalink raw reply

* Re: Using "git log" to find the files patched at the same time as a named  file
From: Junio C Hamano @ 2010-02-03 20:52 UTC (permalink / raw)
  To: Zack Brown; +Cc: git
In-Reply-To: <218b69371002031238y6a377b06x76b8f8e87ea0ee46@mail.gmail.com>

Zack Brown <zacharyb@gmail.com> writes:

> If I have a filename I'm interested in, and I want to find other files
> that have been modified in the same commits that modified the file I'm
> interested in, how could I do that with git?

Like this?

$ git log --full-diff --name-status v1.6.0..master -- Makefile

to ask "Which files have changed in the commit that touch Makefile since
v1.6.0 up to the tip of the master?"

^ permalink raw reply

* [PATCH]     git gui spanish translation.
From: Alejandro Riveira Fernández @ 2010-02-01 19:51 UTC (permalink / raw)


     It is the first try maybe we can later come up with
    better translations for some verbs and nouns that do
    not have a good short translation in spanish ...
    [ Added corrrections made by Wincent Colaiuta <win@wincent.com> ]
---
 git-gui/po/es.po | 2546 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 2546 insertions(+), 0 deletions(-)
 create mode 100644 git-gui/po/es.po

diff --git a/git-gui/po/es.po b/git-gui/po/es.po
new file mode 100644
index 0000000..d2f77cb
--- /dev/null
+++ b/git-gui/po/es.po
@@ -0,0 +1,2546 @@
+# git-gui translation to spanish
+# Copyright (C) 2010 "Shawn O. Pearce" <spearce@spearce.org>
+# This file is distributed under the same license as the git-gui package.
+# alejandro Riveira Fernández <ariveira@gmail.com>, 2010.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: git-gui\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-12-08 08:31-0800\n"
+"PO-Revision-Date: 2010-02-03 21:21+0100\n"
+"Last-Translator: Alejandro Riveira Fernández <ariveira@gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: git-gui.sh:41 git-gui.sh:737 git-gui.sh:751 git-gui.sh:764 git-gui.sh:847
+#: git-gui.sh:866
+msgid "git-gui: fatal error"
+msgstr "git-gui: error fatal"
+
+#: git-gui.sh:689
+#, tcl-format
+msgid "Invalid font specified in %s:"
+msgstr "Fuente especificada no válida en %s:"
+
+#: git-gui.sh:723
+msgid "Main Font"
+msgstr "Fuente Principal"
+
+#: git-gui.sh:724
+msgid "Diff/Console Font"
+msgstr "Fuente para Parches/Consola"
+
+#: git-gui.sh:738
+msgid "Cannot find git in PATH."
+msgstr "git no se encuentra en PATH."
+
+#: git-gui.sh:765
+msgid "Cannot parse Git version string:"
+msgstr "No se puede analizar la cadena de version de Git:"
+
+#: git-gui.sh:783
+#, tcl-format
+msgid ""
+"Git version cannot be determined.\n"
+"\n"
+"%s claims it is version '%s'.\n"
+"\n"
+"%s requires at least Git 1.5.0 or later.\n"
+"\n"
+"Assume '%s' is version 1.5.0?\n"
+msgstr ""
+"No se puede determinar la version de Git,\n"
+"\n"
+"%s dice que es la version '%s',\n"
+"\n"
+"%s requiere al menos Git 1.5.0 o superior.\n"
+"\n"
+"Asumir que '%s' es versión 1.5.0.?\n"
+
+#: git-gui.sh:1062
+msgid "Git directory not found:"
+msgstr "Directorio Git no encontrado:"
+
+#: git-gui.sh:1069
+msgid "Cannot move to top of working directory:"
+msgstr "No se ha podido cambiar al directorio de trabajo superior:"
+
+#: git-gui.sh:1076
+msgid "Cannot use funny .git directory:"
+msgstr "No se puede usar un directorio .git \"extraño\":"
+
+#: git-gui.sh:1081
+msgid "No working directory"
+msgstr "No hay directorio de trabajo"
+
+#: git-gui.sh:1247 lib/checkout_op.tcl:305
+msgid "Refreshing file status..."
+msgstr "Actualizando el estado del fichero..."
+
+#: git-gui.sh:1303
+msgid "Scanning for modified files ..."
+msgstr "Buscando ficheros modificados ..."
+
+#: git-gui.sh:1367
+msgid "Calling prepare-commit-msg hook..."
+msgstr "Llamando al gancho prepare-commit-hook..."
+
+#: git-gui.sh:1384
+msgid "Commit declined by prepare-commit-msg hook."
+msgstr "Revisión rechazada por el gancho prepare-commit-msg."
+
+#: git-gui.sh:1542 lib/browser.tcl:246
+msgid "Ready."
+msgstr "Listo."
+
+#: git-gui.sh:1726
+#, tcl-format
+msgid "Displaying only %s of %s files."
+msgstr "Mostrando solo %s de %s ficheros."
+
+#: git-gui.sh:1819
+msgid "Unmodified"
+msgstr "No modificado"
+
+#: git-gui.sh:1821
+msgid "Modified, not staged"
+msgstr "Modificado, no preparado"
+
+#: git-gui.sh:1822 git-gui.sh:1830
+msgid "Staged for commit"
+msgstr "Preparado para nueva revisión"
+
+#: git-gui.sh:1823 git-gui.sh:1831
+msgid "Portions staged for commit"
+msgstr "Secciones preparadas para nueva revisión"
+
+#: git-gui.sh:1824 git-gui.sh:1832
+msgid "Staged for commit, missing"
+msgstr "Preparado para nueva revisión, faltan"
+
+#: git-gui.sh:1826
+msgid "File type changed, not staged"
+msgstr "Tipo de fichero ha cambiado, no preparado"
+
+#: git-gui.sh:1827
+msgid "File type changed, staged"
+msgstr "Tipo de fichero ha cambiado, preparado"
+
+#: git-gui.sh:1829
+msgid "Untracked, not staged"
+msgstr "No registrado, no preparado"
+
+#: git-gui.sh:1834
+msgid "Missing"
+msgstr "Falta"
+
+#: git-gui.sh:1835
+msgid "Staged for removal"
+msgstr "Preparado para borrar"
+
+#: git-gui.sh:1836
+msgid "Staged for removal, still present"
+msgstr "Preparado para borrar, todavía presente"
+
+#: git-gui.sh:1838 git-gui.sh:1839 git-gui.sh:1840 git-gui.sh:1841
+#: git-gui.sh:1842 git-gui.sh:1843
+msgid "Requires merge resolution"
+msgstr "Requiere la resolución de conflictos"
+
+#: git-gui.sh:1878
+msgid "Starting gitk... please wait..."
+msgstr "Ejecutando gitk... por favor espere..."
+
+#: git-gui.sh:1887
+msgid "Couldn't find gitk in PATH"
+msgstr "No se ha podido encontrar gitk en PATH"
+
+#: git-gui.sh:2280 lib/choose_repository.tcl:36
+msgid "Repository"
+msgstr "Repositorio"
+
+#: git-gui.sh:2281
+msgid "Edit"
+msgstr "Editar"
+
+#: git-gui.sh:2283 lib/choose_rev.tcl:561
+msgid "Branch"
+msgstr "Rama"
+
+#: git-gui.sh:2286 lib/choose_rev.tcl:548
+msgid "Commit@@noun"
+msgstr "Revisión"
+
+#: git-gui.sh:2289 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
+msgid "Merge"
+msgstr "Fusión"
+
+#: git-gui.sh:2290 lib/choose_rev.tcl:557
+msgid "Remote"
+msgstr "Remoto"
+
+#: git-gui.sh:2293
+msgid "Tools"
+msgstr "Herramientas"
+
+#: git-gui.sh:2302
+msgid "Explore Working Copy"
+msgstr "Explorar la copia de trabajo"
+
+#: git-gui.sh:2307
+msgid "Browse Current Branch's Files"
+msgstr "Explore los ficheros de la rama actual"
+
+#: git-gui.sh:2311
+msgid "Browse Branch Files..."
+msgstr "Explora los ficheros de la rama..."
+
+#: git-gui.sh:2316
+msgid "Visualize Current Branch's History"
+msgstr "Visualiza la historia de la rama actual"
+
+#: git-gui.sh:2320
+msgid "Visualize All Branch History"
+msgstr "Visualiza la historia de todas las ramas"
+
+#: git-gui.sh:2327
+#, tcl-format
+msgid "Browse %s's Files"
+msgstr "Explora los ficheros de %s"
+
+#: git-gui.sh:2329
+#, tcl-format
+msgid "Visualize %s's History"
+msgstr "Visualiza la historia de %s"
+
+#: git-gui.sh:2334 lib/database.tcl:27 lib/database.tcl:67
+msgid "Database Statistics"
+msgstr "Estadisticas de la Base de Datos"
+
+#: git-gui.sh:2337 lib/database.tcl:34
+msgid "Compress Database"
+msgstr "Comprimir Base de Datos"
+
+#: git-gui.sh:2340
+msgid "Verify Database"
+msgstr "Verificar Base de Datos"
+
+#: git-gui.sh:2347 git-gui.sh:2351 git-gui.sh:2355 lib/shortcut.tcl:7
+#: lib/shortcut.tcl:39 lib/shortcut.tcl:71
+msgid "Create Desktop Icon"
+msgstr "Crear icono de escritorio"
+
+#: git-gui.sh:2363 lib/choose_repository.tcl:183 lib/choose_repository.tcl:191
+msgid "Quit"
+msgstr "Salir"
+
+#: git-gui.sh:2371
+msgid "Undo"
+msgstr "Deshacer"
+
+#: git-gui.sh:2374
+msgid "Redo"
+msgstr "Rehacer"
+
+#: git-gui.sh:2378 git-gui.sh:2937
+msgid "Cut"
+msgstr "Cortar"
+
+#: git-gui.sh:2381 git-gui.sh:2940 git-gui.sh:3014 git-gui.sh:3096
+#: lib/console.tcl:69
+msgid "Copy"
+msgstr "Copiar"
+
+#: git-gui.sh:2384 git-gui.sh:2943
+msgid "Paste"
+msgstr "Pegar"
+
+#: git-gui.sh:2387 git-gui.sh:2946 lib/branch_delete.tcl:26
+#: lib/remote_branch_delete.tcl:38
+msgid "Delete"
+msgstr "Borrar"
+
+#: git-gui.sh:2391 git-gui.sh:2950 git-gui.sh:3100 lib/console.tcl:71
+msgid "Select All"
+msgstr "Seleccionar Todo"
+
+#: git-gui.sh:2400
+msgid "Create..."
+msgstr "Crear..."
+
+#: git-gui.sh:2406
+msgid "Checkout..."
+msgstr "Activar..."
+
+#: git-gui.sh:2412
+msgid "Rename..."
+msgstr "Renombrar..."
+
+#: git-gui.sh:2417
+msgid "Delete..."
+msgstr "Borrar..."
+
+#: git-gui.sh:2422
+msgid "Reset..."
+msgstr "Reinicializar..."
+
+#: git-gui.sh:2432
+msgid "Done"
+msgstr "Hecho"
+
+#: git-gui.sh:2434
+msgid "Commit@@verb"
+msgstr "Crear Revisión"
+
+#: git-gui.sh:2443 git-gui.sh:2878
+msgid "New Commit"
+msgstr "Nueva Revisión"
+
+#: git-gui.sh:2451 git-gui.sh:2885
+msgid "Amend Last Commit"
+msgstr "Corregir última Revisión"
+
+#: git-gui.sh:2461 git-gui.sh:2839 lib/remote_branch_delete.tcl:99
+msgid "Rescan"
+msgstr "Reanalizar"
+
+#: git-gui.sh:2467
+msgid "Stage To Commit"
+msgstr "Preparar para crear nueva revisión"
+
+#: git-gui.sh:2473
+msgid "Stage Changed Files To Commit"
+msgstr "Preparar ficheros modificados para nueva revisión"
+
+#: git-gui.sh:2479
+msgid "Unstage From Commit"
+msgstr "Anular preparación para nueva revisión"
+
+#: git-gui.sh:2484 lib/index.tcl:410
+msgid "Revert Changes"
+msgstr "Anular cambios"
+
+#: git-gui.sh:2491 git-gui.sh:3083
+msgid "Show Less Context"
+msgstr "Mostrar menos contexto"
+
+#: git-gui.sh:2495 git-gui.sh:3087
+msgid "Show More Context"
+msgstr "Mostar más contexto"
+
+#: git-gui.sh:2502 git-gui.sh:2852 git-gui.sh:2961
+msgid "Sign Off"
+msgstr "Sign Off"
+
+#: git-gui.sh:2518
+msgid "Local Merge..."
+msgstr "Fusión local..."
+
+#: git-gui.sh:2523
+msgid "Abort Merge..."
+msgstr "Anular fusión..."
+
+#: git-gui.sh:2535 git-gui.sh:2575
+msgid "Add..."
+msgstr "Añadir..."
+
+#: git-gui.sh:2539
+msgid "Push..."
+msgstr "Propagar..."
+
+#: git-gui.sh:2543
+msgid "Delete Branch..."
+msgstr "Borrar rama..."
+
+#: git-gui.sh:2553 git-gui.sh:2589 lib/about.tcl:14
+#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53
+#, tcl-format
+msgid "About %s"
+msgstr "Sobre %s"
+
+#: git-gui.sh:2557
+msgid "Preferences..."
+msgstr "Preferencias..."
+
+#: git-gui.sh:2565 git-gui.sh:3129
+msgid "Options..."
+msgstr "Opciones..."
+
+#: git-gui.sh:2576
+msgid "Remove..."
+msgstr "Borrar..."
+
+#: git-gui.sh:2585 lib/choose_repository.tcl:50
+msgid "Help"
+msgstr "Ayuda"
+
+#: git-gui.sh:2611
+msgid "Online Documentation"
+msgstr "Documentacion en linea"
+
+#: git-gui.sh:2614 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56
+msgid "Show SSH Key"
+msgstr "Mostrar clave SSH"
+
+#: git-gui.sh:2721
+#, tcl-format
+msgid "fatal: cannot stat path %s: No such file or directory"
+msgstr "fatal: stat path %s falló: No hay tal fichero o directorio"
+
+#: git-gui.sh:2754
+msgid "Current Branch:"
+msgstr "Rama actual:"
+
+#: git-gui.sh:2775
+msgid "Staged Changes (Will Commit)"
+msgstr "Cambios Preparados (crearán nueva revisión)"
+
+#: git-gui.sh:2795
+msgid "Unstaged Changes"
+msgstr "Cambios no preparados"
+
+#: git-gui.sh:2845
+msgid "Stage Changed"
+msgstr "Preparar Cambiados"
+
+#: git-gui.sh:2864 lib/transport.tcl:104 lib/transport.tcl:193
+msgid "Push"
+msgstr "Propagar"
+
+#: git-gui.sh:2899
+msgid "Initial Commit Message:"
+msgstr "Mensaje de la revisión inicial:"
+
+#: git-gui.sh:2900
+msgid "Amended Commit Message:"
+msgstr "Corregir el mensaje de la Revisión:"
+
+#: git-gui.sh:2901
+msgid "Amended Initial Commit Message:"
+msgstr "Corregir el mensaje de la revisión inicial:"
+
+#: git-gui.sh:2902
+msgid "Amended Merge Commit Message:"
+msgstr "Corregir el mensaje de la revisión de fusión:"
+
+#: git-gui.sh:2903
+msgid "Merge Commit Message:"
+msgstr "Mensaje de la revisión de Fusión:"
+
+#: git-gui.sh:2904
+msgid "Commit Message:"
+msgstr "Mensaje de la revisión:"
+
+#: git-gui.sh:2953 git-gui.sh:3104 lib/console.tcl:73
+msgid "Copy All"
+msgstr "Copiar todo"
+
+#: git-gui.sh:2977 lib/blame.tcl:104
+msgid "File:"
+msgstr "Fichero:"
+
+#: git-gui.sh:3092
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: git-gui.sh:3113
+msgid "Decrease Font Size"
+msgstr "Disminuir tamaño de la fuente"
+
+#: git-gui.sh:3117
+msgid "Increase Font Size"
+msgstr "Aumentar tamaño de la fuente"
+
+#: git-gui.sh:3125 lib/blame.tcl:281
+msgid "Encoding"
+msgstr "Codificación"
+
+#: git-gui.sh:3136
+msgid "Apply/Reverse Hunk"
+msgstr "Aplicar/Revertir sección"
+
+#: git-gui.sh:3141
+msgid "Apply/Reverse Line"
+msgstr "Aplicar/Revertir linea"
+
+#: git-gui.sh:3151
+msgid "Run Merge Tool"
+msgstr "Ejecutar herramienta de resolución de conflictos"
+
+#: git-gui.sh:3156
+msgid "Use Remote Version"
+msgstr "Usar la versión remota"
+
+#: git-gui.sh:3160
+msgid "Use Local Version"
+msgstr "Usar la versión local"
+
+#: git-gui.sh:3164
+msgid "Revert To Base"
+msgstr "Revertir a versión Común"
+
+#: git-gui.sh:3183
+msgid "Unstage Hunk From Commit"
+msgstr "Anular preparación de la sección para revisión"
+
+#: git-gui.sh:3184
+msgid "Unstage Line From Commit"
+msgstr "Anular preparación de la linea para revisión"
+
+#: git-gui.sh:3186
+msgid "Stage Hunk For Commit"
+msgstr "Preparar la sección para nueva revisión"
+
+#: git-gui.sh:3187
+msgid "Stage Line For Commit"
+msgstr "Preparar la linea para nueva revisión"
+
+#: git-gui.sh:3210
+msgid "Initializing..."
+msgstr "Inicializando..."
+
+#: git-gui.sh:3315
+#, tcl-format
+msgid ""
+"Possible environment issues exist.\n"
+"\n"
+"The following environment variables are probably\n"
+"going to be ignored by any Git subprocess run\n"
+"by %s:\n"
+"\n"
+msgstr ""
+"Probablemente hay problemas con las variables de entorno.\n"
+"\n"
+"Las sigientes variables de entorno probablemente serán\n"
+"ignoradas por todos los subprocesos Git ejecutados por\n"
+"%s:\n"
+"\n"
+
+#: git-gui.sh:3345
+msgid ""
+"\n"
+"This is due to a known issue with the\n"
+"Tcl binary distributed by Cygwin."
+msgstr ""
+"\n"
+"Esto es debido a un conocido problema con\n"
+"el binario Tcl distribuido por Cygwin."
+
+#: git-gui.sh:3350
+#, tcl-format
+msgid ""
+"\n"
+"\n"
+"A good replacement for %s\n"
+"is placing values for the user.name and\n"
+"user.email settings into your personal\n"
+"~/.gitconfig file.\n"
+msgstr ""
+"\n"
+"\n"
+"Una buena alternativa a %s\n"
+"es asignar valores a las variables\n"
+"user.name y user.email en su fichero\n"
+"~/.gitconfig personal.\n"
+
+#: lib/about.tcl:26
+msgid "git-gui - a graphical user interface for Git."
+msgstr "git-gui - una intefaz gráfica de usuario para Git."
+
+#: lib/blame.tcl:72
+msgid "File Viewer"
+msgstr "Visor de ficheros"
+
+#: lib/blame.tcl:78
+msgid "Commit:"
+msgstr "Revisión:"
+
+#: lib/blame.tcl:271
+msgid "Copy Commit"
+msgstr "Copiar revisión"
+
+#: lib/blame.tcl:275
+msgid "Find Text..."
+msgstr "Buscar texto..."
+
+#: lib/blame.tcl:284
+msgid "Do Full Copy Detection"
+msgstr "Hacer detección de copia completa"
+
+#: lib/blame.tcl:288
+msgid "Show History Context"
+msgstr "Mostar el contexto historico"
+
+#: lib/blame.tcl:291
+msgid "Blame Parent Commit"
+msgstr "Anotar la revisión precedente"
+
+#: lib/blame.tcl:450
+#, tcl-format
+msgid "Reading %s..."
+msgstr "Leyendo %s..."
+
+#: lib/blame.tcl:557
+msgid "Loading copy/move tracking annotations..."
+msgstr "Cargando las anotaciones de copia/movimiento..."
+
+#: lib/blame.tcl:577
+msgid "lines annotated"
+msgstr "lineas anotadas"
+
+#: lib/blame.tcl:769
+msgid "Loading original location annotations..."
+msgstr "Cargando las anotaciones de la posición original..."
+
+#: lib/blame.tcl:772
+msgid "Annotation complete."
+msgstr "Anotación completa."
+
+#: lib/blame.tcl:802
+msgid "Busy"
+msgstr "Ocupado"
+
+#: lib/blame.tcl:803
+msgid "Annotation process is already running."
+msgstr "El proceso de anotacion ya está ejecutandose."
+
+#: lib/blame.tcl:842
+msgid "Running thorough copy detection..."
+msgstr "Ejecutando detección de copia completa..."
+
+#: lib/blame.tcl:910
+msgid "Loading annotation..."
+msgstr "Cargando anotaciones..."
+
+#: lib/blame.tcl:963
+msgid "Author:"
+msgstr "Autor:"
+
+#: lib/blame.tcl:967
+msgid "Committer:"
+msgstr "Committer:"
+
+#: lib/blame.tcl:972
+msgid "Original File:"
+msgstr "Fichero original:"
+
+#: lib/blame.tcl:1020
+msgid "Cannot find HEAD commit:"
+msgstr "No se puede encontrar la revisión HEAD:"
+
+#: lib/blame.tcl:1075
+msgid "Cannot find parent commit:"
+msgstr "No se puede encontrar la revisión precedente:"
+
+#: lib/blame.tcl:1090
+msgid "Unable to display parent"
+msgstr "No se puede visualizar la revisón precedente"
+
+#: lib/blame.tcl:1091 lib/diff.tcl:297
+msgid "Error loading diff:"
+msgstr "Error cargando el diff:"
+
+#: lib/blame.tcl:1231
+msgid "Originally By:"
+msgstr "Originalmente por:"
+
+#: lib/blame.tcl:1237
+msgid "In File:"
+msgstr "En fichero:"
+
+#: lib/blame.tcl:1242
+msgid "Copied Or Moved Here By:"
+msgstr "Copiado o movido aquí por:"
+
+#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
+msgid "Checkout Branch"
+msgstr "Activar rama"
+
+#: lib/branch_checkout.tcl:23
+msgid "Checkout"
+msgstr "Activar"
+
+#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35
+#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:282
+#: lib/checkout_op.tcl:544 lib/choose_font.tcl:43 lib/merge.tcl:172
+#: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42
+#: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352
+#: lib/transport.tcl:108
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: lib/branch_checkout.tcl:32 lib/browser.tcl:287 lib/tools_dlg.tcl:328
+msgid "Revision"
+msgstr "Revisión"
+
+#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:280
+msgid "Options"
+msgstr "Opciones"
+
+#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92
+msgid "Fetch Tracking Branch"
+msgstr "Traer duplicado local de rama remota"
+
+#: lib/branch_checkout.tcl:44
+msgid "Detach From Local Branch"
+msgstr "Desvincular de rama local"
+
+#: lib/branch_create.tcl:22
+msgid "Create Branch"
+msgstr "Crear rama"
+
+#: lib/branch_create.tcl:27
+msgid "Create New Branch"
+msgstr "Crear nueva rama"
+
+#: lib/branch_create.tcl:31 lib/choose_repository.tcl:377
+msgid "Create"
+msgstr "Crear"
+
+#: lib/branch_create.tcl:40
+msgid "Branch Name"
+msgstr "Nombre de la rama"
+
+#: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50
+msgid "Name:"
+msgstr "Nombre:"
+
+#: lib/branch_create.tcl:58
+msgid "Match Tracking Branch Name"
+msgstr "Casar nombre del duplicado local de rama remota"
+
+#: lib/branch_create.tcl:66
+msgid "Starting Revision"
+msgstr "Iniciando revisión"
+
+#: lib/branch_create.tcl:72
+msgid "Update Existing Branch:"
+msgstr "Actualizar rama existente:"
+
+#: lib/branch_create.tcl:75
+msgid "No"
+msgstr "No"
+
+#: lib/branch_create.tcl:80
+msgid "Fast Forward Only"
+msgstr "Solo Fast Forward"
+
+#: lib/branch_create.tcl:85 lib/checkout_op.tcl:536
+msgid "Reset"
+msgstr "Reinicializa"
+
+#: lib/branch_create.tcl:97
+msgid "Checkout After Creation"
+msgstr "Activar después de crear"
+
+#: lib/branch_create.tcl:131
+msgid "Please select a tracking branch."
+msgstr "Por favor escoja un duplicado local de rama remota."
+
+#: lib/branch_create.tcl:140
+#, tcl-format
+msgid "Tracking branch %s is not a branch in the remote repository."
+msgstr "El duplicado local de rama remota %s no es una rama en el repositorio remoto."
+
+#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86
+msgid "Please supply a branch name."
+msgstr "Por favor indique el nombre de rama."
+
+#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106
+#, tcl-format
+msgid "'%s' is not an acceptable branch name."
+msgstr "'%s' no es un nombre de rama válido."
+
+#: lib/branch_delete.tcl:15
+msgid "Delete Branch"
+msgstr "Borrar rama"
+
+#: lib/branch_delete.tcl:20
+msgid "Delete Local Branch"
+msgstr "Borrar rama local"
+
+#: lib/branch_delete.tcl:37
+msgid "Local Branches"
+msgstr "Ramas locales"
+
+#: lib/branch_delete.tcl:52
+msgid "Delete Only If Merged Into"
+msgstr "Borrar solo si fusionada con otra rama"
+
+#: lib/branch_delete.tcl:54
+msgid "Always (Do not perform merge test.)"
+msgstr "Siempre (No hacer comprobación de fusión.)"
+
+#: lib/branch_delete.tcl:103
+#, tcl-format
+msgid "The following branches are not completely merged into %s:"
+msgstr "Las ramas siguientes no han sido completamente fusionadas en %s:"
+
+#: lib/branch_delete.tcl:141
+#, tcl-format
+msgid ""
+"Failed to delete branches:\n"
+"%s"
+msgstr ""
+"Se falló al borrar las ramas:\n"
+"%s"
+
+#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22
+msgid "Rename Branch"
+msgstr "Renombrar rama"
+
+#: lib/branch_rename.tcl:26
+msgid "Rename"
+msgstr "Renombrar"
+
+#: lib/branch_rename.tcl:36
+msgid "Branch:"
+msgstr "Rama:"
+
+#: lib/branch_rename.tcl:39
+msgid "New Name:"
+msgstr "Nuevo nombre:"
+
+#: lib/branch_rename.tcl:75
+msgid "Please select a branch to rename."
+msgstr "Por favor seleccione la rama a renombrar."
+
+#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:201
+#, tcl-format
+msgid "Branch '%s' already exists."
+msgstr "La rama '%s' ya existe."
+
+#: lib/branch_rename.tcl:117
+#, tcl-format
+msgid "Failed to rename '%s'."
+msgstr "Se falló al renombrar '%s'."
+
+#: lib/browser.tcl:17
+msgid "Starting..."
+msgstr "Iniciando..."
+
+#: lib/browser.tcl:26
+msgid "File Browser"
+msgstr "Explorador de archivos"
+
+#: lib/browser.tcl:126 lib/browser.tcl:143
+#, tcl-format
+msgid "Loading %s..."
+msgstr "Cargando %s..."
+
+#: lib/browser.tcl:187
+msgid "[Up To Parent]"
+msgstr "[Directorio superior]"
+
+#: lib/browser.tcl:267 lib/browser.tcl:273
+msgid "Browse Branch Files"
+msgstr "Explorar los ficheros de la rama"
+
+#: lib/browser.tcl:278 lib/choose_repository.tcl:394
+#: lib/choose_repository.tcl:480 lib/choose_repository.tcl:491
+#: lib/choose_repository.tcl:995
+msgid "Browse"
+msgstr "Explorar"
+
+#: lib/checkout_op.tcl:84
+#, tcl-format
+msgid "Fetching %s from %s"
+msgstr "Trayendo %s de %s"
+
+#: lib/checkout_op.tcl:132
+#, tcl-format
+msgid "fatal: Cannot resolve %s"
+msgstr "fatal: No se pudo resolver %s"
+
+#: lib/checkout_op.tcl:145 lib/console.tcl:81 lib/database.tcl:31
+#: lib/sshkey.tcl:53
+msgid "Close"
+msgstr "Cerrar"
+
+#: lib/checkout_op.tcl:174
+#, tcl-format
+msgid "Branch '%s' does not exist."
+msgstr "La rama '%s' no existe."
+
+#: lib/checkout_op.tcl:193
+#, tcl-format
+msgid "Failed to configure simplified git-pull for '%s'."
+msgstr "Se falló al configurar el git-pull simplificado para '%s'."
+
+#: lib/checkout_op.tcl:228
+#, tcl-format
+msgid ""
+"Branch '%s' already exists.\n"
+"\n"
+"It cannot fast-forward to %s.\n"
+"A merge is required."
+msgstr ""
+"La rama '%s' ya existe.\n"
+"\n"
+"No se puede hacer fast-forward a %s.\n"
+"Se requiere una fusión."
+
+#: lib/checkout_op.tcl:242
+#, tcl-format
+msgid "Merge strategy '%s' not supported."
+msgstr "La estrategia de fusión '%s' no está soportada."
+
+#: lib/checkout_op.tcl:261
+#, tcl-format
+msgid "Failed to update '%s'."
+msgstr "Se falló al actualizar '%s'."
+
+#: lib/checkout_op.tcl:273
+msgid "Staging area (index) is already locked."
+msgstr "El área de preparación (index) ya está bloqueada."
+
+#: lib/checkout_op.tcl:288
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before the current branch can be changed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"El último estado escaneado no casa con el estado del repositorio.\n"
+"\n"
+"Otro programa de Git a modificado este repositorio desde el último escaneo.\n"
+"Un nuevo escaneo debe realizarse antes de que la rama actual pueda cambiarse.\n"
+"\n"
+"El escaneo empezará automaticamente ahora.\n"
+
+#: lib/checkout_op.tcl:344
+#, tcl-format
+msgid "Updating working directory to '%s'..."
+msgstr "Actualizando el directorio de trabajo a '%s'..."
+
+#: lib/checkout_op.tcl:345
+msgid "files checked out"
+msgstr "ficheros en el directorio de trabajo"
+
+#: lib/checkout_op.tcl:375
+#, tcl-format
+msgid "Aborted checkout of '%s' (file level merging is required)."
+msgstr "Activación de '%s' abortada (fusión a nivel de fichero necesaria)."
+
+#: lib/checkout_op.tcl:376
+msgid "File level merge required."
+msgstr "Fusión a nivel de fichero necesaria."
+
+#: lib/checkout_op.tcl:380
+#, tcl-format
+msgid "Staying on branch '%s'."
+msgstr "Permaneciendo en rama '%s'."
+
+#: lib/checkout_op.tcl:451
+msgid ""
+"You are no longer on a local branch.\n"
+"\n"
+"If you wanted to be on a branch, create one now starting from 'This Detached "
+"Checkout'."
+msgstr ""
+"Ya no estas en una rama local.\n"
+"\n"
+"Si lo que querías era estar en una rama, crea una ahora a\n"
+"partir de 'This Detached Checkout'."
+
+#: lib/checkout_op.tcl:468 lib/checkout_op.tcl:472
+#, tcl-format
+msgid "Checked out '%s'."
+msgstr "Activada '%s'."
+
+#: lib/checkout_op.tcl:500
+#, tcl-format
+msgid "Resetting '%s' to '%s' will lose the following commits:"
+msgstr "Reinicializar '%s' a '%s' hará que se pierdan estas revisiones:"
+
+#: lib/checkout_op.tcl:522
+msgid "Recovering lost commits may not be easy."
+msgstr "Recuperar las revisiones perdidas puede no ser facil."
+
+#: lib/checkout_op.tcl:527
+#, tcl-format
+msgid "Reset '%s'?"
+msgstr "¿Reinicializar '%s'?"
+
+#: lib/checkout_op.tcl:532 lib/merge.tcl:164 lib/tools_dlg.tcl:343
+msgid "Visualize"
+msgstr "Visualizar"
+
+#: lib/checkout_op.tcl:600
+#, tcl-format
+msgid ""
+"Failed to set current branch.\n"
+"\n"
+"This working directory is only partially switched.  We successfully updated "
+"your files, but failed to update an internal Git file.\n"
+"\n"
+"This should not have occurred.  %s will now close and give up."
+msgstr ""
+"Se falló al preparar la rama actual.\n"
+"\n"
+"Este directorio de trabajo está solo parcialmente cambiado. Se han actualizado\n"
+"tus ficheros con éxito, pero se falló al actualizar un fichero interno de Git.\n"
+"\n"
+"Esto no debería de haber ocurrido. %s se cerrará y desistirá."
+
+#: lib/choose_font.tcl:39
+msgid "Select"
+msgstr "Selecciona"
+
+#: lib/choose_font.tcl:53
+msgid "Font Family"
+msgstr "Familia de fuente"
+
+#: lib/choose_font.tcl:74
+msgid "Font Size"
+msgstr "Tamaño de fuente"
+
+#: lib/choose_font.tcl:91
+msgid "Font Example"
+msgstr "Ejemplo de fuente"
+
+#: lib/choose_font.tcl:103
+msgid ""
+"This is example text.\n"
+"If you like this text, it can be your font."
+msgstr ""
+"Esto es testo de ejemplo.\n"
+"Si te gusta este texto, esta puede ser tu fuente."
+
+#: lib/choose_repository.tcl:28
+msgid "Git Gui"
+msgstr "Git Gui"
+
+#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:382
+msgid "Create New Repository"
+msgstr "Crear nuevo repositorio"
+
+#: lib/choose_repository.tcl:93
+msgid "New..."
+msgstr "Nuevo..."
+
+#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:465
+msgid "Clone Existing Repository"
+msgstr "Clonar un repositorio existente"
+
+#: lib/choose_repository.tcl:106
+msgid "Clone..."
+msgstr "Clonar..."
+
+#: lib/choose_repository.tcl:113 lib/choose_repository.tcl:983
+msgid "Open Existing Repository"
+msgstr "Abrir un repositorio existente"
+
+#: lib/choose_repository.tcl:119
+msgid "Open..."
+msgstr "Abrir..."
+
+#: lib/choose_repository.tcl:132
+msgid "Recent Repositories"
+msgstr "Repositorios recientes"
+
+#: lib/choose_repository.tcl:138
+msgid "Open Recent Repository:"
+msgstr "Abrir repositorio reciente:"
+
+#: lib/choose_repository.tcl:302 lib/choose_repository.tcl:309
+#: lib/choose_repository.tcl:316
+#, tcl-format
+msgid "Failed to create repository %s:"
+msgstr "Se falló al crear el repositorio %s:"
+
+#: lib/choose_repository.tcl:387
+msgid "Directory:"
+msgstr "Directorio:"
+
+#: lib/choose_repository.tcl:417 lib/choose_repository.tcl:544
+#: lib/choose_repository.tcl:1017
+msgid "Git Repository"
+msgstr "Repositorio git"
+
+#: lib/choose_repository.tcl:442
+#, tcl-format
+msgid "Directory %s already exists."
+msgstr "El directorio %s ya existe."
+
+#: lib/choose_repository.tcl:446
+#, tcl-format
+msgid "File %s already exists."
+msgstr "El fichero %s ya existe."
+
+#: lib/choose_repository.tcl:460
+msgid "Clone"
+msgstr "Clonar"
+
+#: lib/choose_repository.tcl:473
+msgid "Source Location:"
+msgstr "Localizacion del código fuente:"
+
+#: lib/choose_repository.tcl:484
+msgid "Target Directory:"
+msgstr "Directorio objetivo:"
+
+#: lib/choose_repository.tcl:496
+msgid "Clone Type:"
+msgstr "Tipo de clonado:"
+
+#: lib/choose_repository.tcl:502
+msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
+msgstr "Standar (Rápido, semi-redundante, con hard links)"
+
+#: lib/choose_repository.tcl:508
+msgid "Full Copy (Slower, Redundant Backup)"
+msgstr "Copia completa (Más lento, redundante, copia de respaldo)"
+
+#: lib/choose_repository.tcl:514
+msgid "Shared (Fastest, Not Recommended, No Backup)"
+msgstr "Compartido (el más rápido, no recomendado, no es copia de respaldo)"
+
+#: lib/choose_repository.tcl:550 lib/choose_repository.tcl:597
+#: lib/choose_repository.tcl:743 lib/choose_repository.tcl:813
+#: lib/choose_repository.tcl:1023 lib/choose_repository.tcl:1031
+#, tcl-format
+msgid "Not a Git repository: %s"
+msgstr "No es un repositorio Git: %s"
+
+#: lib/choose_repository.tcl:586
+msgid "Standard only available for local repository."
+msgstr "Standar solo disponible para repositorios locales."
+
+#: lib/choose_repository.tcl:590
+msgid "Shared only available for local repository."
+msgstr "Compartido solo disponible para repositorios locales."
+
+#: lib/choose_repository.tcl:611
+#, tcl-format
+msgid "Location %s already exists."
+msgstr "La localizacion %s ya existe."
+
+#: lib/choose_repository.tcl:622
+msgid "Failed to configure origin"
+msgstr "Se falló al configurar origen"
+
+#: lib/choose_repository.tcl:634
+msgid "Counting objects"
+msgstr "Contando objetos"
+
+#: lib/choose_repository.tcl:635
+msgid "buckets"
+msgstr "cubos"
+
+#: lib/choose_repository.tcl:659
+#, tcl-format
+msgid "Unable to copy objects/info/alternates: %s"
+msgstr "No se pudo copiar objetos/info/alternativas: %s"
+
+#: lib/choose_repository.tcl:695
+#, tcl-format
+msgid "Nothing to clone from %s."
+msgstr "Nada que clonar desde %s."
+
+#: lib/choose_repository.tcl:697 lib/choose_repository.tcl:911
+#: lib/choose_repository.tcl:923
+msgid "The 'master' branch has not been initialized."
+msgstr "La rama 'master' no ha sido inicializada."
+
+#: lib/choose_repository.tcl:710
+msgid "Hardlinks are unavailable.  Falling back to copying."
+msgstr "Hardlinks no disponibles. Se recurre a copiar."
+
+#: lib/choose_repository.tcl:722
+#, tcl-format
+msgid "Cloning from %s"
+msgstr "Clonando desde %s"
+
+#: lib/choose_repository.tcl:753
+msgid "Copying objects"
+msgstr "Copiando objetos"
+
+#: lib/choose_repository.tcl:754
+msgid "KiB"
+msgstr "KiB"
+
+#: lib/choose_repository.tcl:778
+#, tcl-format
+msgid "Unable to copy object: %s"
+msgstr "No se puede copiar objeto: %s"
+
+#: lib/choose_repository.tcl:788
+msgid "Linking objects"
+msgstr "Vinculando (hardlinks) objetos"
+
+#: lib/choose_repository.tcl:789
+msgid "objects"
+msgstr "objetos"
+
+#: lib/choose_repository.tcl:797
+#, tcl-format
+msgid "Unable to hardlink object: %s"
+msgstr "No se puede vincular (hardlink) el objeto: %s"
+
+#: lib/choose_repository.tcl:852
+msgid "Cannot fetch branches and objects.  See console output for details."
+msgstr "Imposible traer las ramas y objetos. Para mas detalles vea la salida de consola"
+
+#: lib/choose_repository.tcl:863
+msgid "Cannot fetch tags.  See console output for details."
+msgstr "Imposible traer etiquetas. Para más detalles vea la salida de consola"
+
+#: lib/choose_repository.tcl:887
+msgid "Cannot determine HEAD.  See console output for details."
+msgstr "No se puede determinar HEAD. Para más detalles vea la salida de consola."
+
+#: lib/choose_repository.tcl:896
+#, tcl-format
+msgid "Unable to cleanup %s"
+msgstr "Imposible limpiar %s"
+
+#: lib/choose_repository.tcl:902
+msgid "Clone failed."
+msgstr "Fallo al clonar."
+
+#: lib/choose_repository.tcl:909
+msgid "No default branch obtained."
+msgstr "No se obtuvo la rama por defecto."
+
+#: lib/choose_repository.tcl:920
+#, tcl-format
+msgid "Cannot resolve %s as a commit."
+msgstr "No se pudo resolver %s como revisión."
+
+#: lib/choose_repository.tcl:932
+msgid "Creating working directory"
+msgstr "Creando el directorio de trabajo"
+
+#: lib/choose_repository.tcl:933 lib/index.tcl:65 lib/index.tcl:128
+#: lib/index.tcl:196
+msgid "files"
+msgstr "ficheros"
+
+#: lib/choose_repository.tcl:962
+msgid "Initial file checkout failed."
+msgstr "Falló la activacion inicial de ficheros."
+
+#: lib/choose_repository.tcl:978
+msgid "Open"
+msgstr "Abrir"
+
+#: lib/choose_repository.tcl:988
+msgid "Repository:"
+msgstr "Repositorio:"
+
+#: lib/choose_repository.tcl:1037
+#, tcl-format
+msgid "Failed to open repository %s:"
+msgstr "Se falló al abrir el repositorio %s:"
+
+#: lib/choose_rev.tcl:53
+msgid "This Detached Checkout"
+msgstr ""
+
+#: lib/choose_rev.tcl:60
+msgid "Revision Expression:"
+msgstr "Expresión de revisión:"
+
+#: lib/choose_rev.tcl:74
+msgid "Local Branch"
+msgstr "Rama local"
+
+#: lib/choose_rev.tcl:79
+msgid "Tracking Branch"
+msgstr "Duplicado local de rama remota"
+
+#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538
+msgid "Tag"
+msgstr "Etiqueta"
+
+#: lib/choose_rev.tcl:317
+#, tcl-format
+msgid "Invalid revision: %s"
+msgstr "Revisión no válida: %s"
+
+#: lib/choose_rev.tcl:338
+msgid "No revision selected."
+msgstr "No se ha seleccionado revisión."
+
+#: lib/choose_rev.tcl:346
+msgid "Revision expression is empty."
+msgstr "Expresión de revisión vacía."
+
+#: lib/choose_rev.tcl:531
+msgid "Updated"
+msgstr "Actualizado"
+
+#: lib/choose_rev.tcl:559
+msgid "URL"
+msgstr "URL"
+
+#: lib/commit.tcl:9
+msgid ""
+"There is nothing to amend.\n"
+"\n"
+"You are about to create the initial commit.  There is no commit before this "
+"to amend.\n"
+msgstr ""
+"No hay nada que corregir.\n"
+"\n"
+"Va usted a crear la revisón inicial. No hay ninguna revisión anterior\n"
+"que corregir.\n"
+
+#: lib/commit.tcl:18
+msgid ""
+"Cannot amend while merging.\n"
+"\n"
+"You are currently in the middle of a merge that has not been fully "
+"completed.  You cannot amend the prior commit unless you first abort the "
+"current merge activity.\n"
+msgstr ""
+"No se puede corregir mientras durante una fusión.\n"
+"\n"
+"Esta usted en el medio de un proceso de fusión que no ha\n"
+"sido completado. No puede corregir la revision anterior a\n"
+"no ser que primero cancele el proceso de fusión.\n"
+
+#: lib/commit.tcl:48
+msgid "Error loading commit data for amend:"
+msgstr "Error al cargar los datos de la revisión para corrección:"
+
+#: lib/commit.tcl:75
+msgid "Unable to obtain your identity:"
+msgstr "Incapaz de obtener su identidad:"
+
+#: lib/commit.tcl:80
+msgid "Invalid GIT_COMMITTER_IDENT:"
+msgstr "GIT_COMMITTER_IDENT inválido:"
+
+#: lib/commit.tcl:132
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before another commit can be created.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"El último estado escaneado no casa con el estado del repositorio.\n"
+"\n"
+"Otro programa de Git a modificado este repositorio desde el último escaneo.\n"
+"Un nuevo escaneo debe realizarse antes de que una nueva revisión pueda crearse.\n"
+"\n"
+"El escaneo empezará automaticamente ahora.\n"
+
+#: lib/commit.tcl:155
+#, tcl-format
+msgid ""
+"Unmerged files cannot be committed.\n"
+"\n"
+"File %s has merge conflicts.  You must resolve them and stage the file "
+"before committing.\n"
+msgstr ""
+"Imosible crear revisón con ficheros sin fusionar.\n"
+"\n"
+"El fichero %s tiene conflictos de fusión. Debe resolverlos y\n"
+"preparar el fichero para nueva revisión antes de continuar.\n"
+
+#: lib/commit.tcl:163
+#, tcl-format
+msgid ""
+"Unknown file state %s detected.\n"
+"\n"
+"File %s cannot be committed by this program.\n"
+msgstr ""
+"Estado de fichero desconocido %s detectado.\n"
+"\n"
+"El programa no puede hacer una revisión con el fichero %s.\n"
+
+#: lib/commit.tcl:171
+msgid ""
+"No changes to commit.\n"
+"\n"
+"You must stage at least 1 file before you can commit.\n"
+msgstr ""
+"No hay cambios para una nueva revisión.\n"
+"\n"
+"Debe preparar para nueva revisón al menos un fichero\n"
+"antes de proceder.\n"
+
+#: lib/commit.tcl:186
+msgid ""
+"Please supply a commit message.\n"
+"\n"
+"A good commit message has the following format:\n"
+"\n"
+"- First line: Describe in one sentence what you did.\n"
+"- Second line: Blank\n"
+"- Remaining lines: Describe why this change is good.\n"
+msgstr ""
+"Por favor facilite un mensaje de revisón.\n"
+"\n"
+"Un buen mensaje tiene el siguiente formato:\n"
+"\n"
+"- Primera linea: Describa en una linea lo que hizo.\n"
+"- Segunda linea: En blanco\n"
+"- Lineas siguientes: Describa porque el cambio es bueno.\n"
+
+#: lib/commit.tcl:210
+#, tcl-format
+msgid "warning: Tcl does not support encoding '%s'."
+msgstr "aviso: Tcl no soporta la codificación '%s'."
+
+#: lib/commit.tcl:226
+msgid "Calling pre-commit hook..."
+msgstr "Ejecutando el hook pre-commit..."
+
+#: lib/commit.tcl:241
+msgid "Commit declined by pre-commit hook."
+msgstr "La revisión ha sido rechazada por el hook pre-commit."
+
+#: lib/commit.tcl:264
+msgid "Calling commit-msg hook..."
+msgstr "Ejecutando el hook commit-msg..."
+
+#: lib/commit.tcl:279
+msgid "Commit declined by commit-msg hook."
+msgstr "La revisión ha sido rechazada por el hook commit-msg."
+
+#: lib/commit.tcl:292
+msgid "Committing changes..."
+msgstr "Archivando los cambios..."
+
+#: lib/commit.tcl:308
+msgid "write-tree failed:"
+msgstr "El write-tree falló:"
+
+#: lib/commit.tcl:309 lib/commit.tcl:353 lib/commit.tcl:373
+msgid "Commit failed."
+msgstr "Se falló al crear una nueva revisión."
+
+#: lib/commit.tcl:326
+#, tcl-format
+msgid "Commit %s appears to be corrupt"
+msgstr "La revisón %s parece estar corrupta."
+
+#: lib/commit.tcl:331
+msgid ""
+"No changes to commit.\n"
+"\n"
+"No files were modified by this commit and it was not a merge commit.\n"
+"\n"
+"A rescan will be automatically started now.\n"
+msgstr ""
+"No hay cambios para una nueva revisión.\n"
+"\n"
+"Ningún fichero ha sido modificado por esta revisión y no es una\n"
+"revisión de fusión.\n"
+"\n"
+"Un rescaneo empezará automaticamente ahora.\n"
+
+#: lib/commit.tcl:338
+msgid "No changes to commit."
+msgstr "No hay cambios para una nueva revisión."
+
+#: lib/commit.tcl:352
+msgid "commit-tree failed:"
+msgstr "Falló el commit-tree:"
+
+#: lib/commit.tcl:372
+msgid "update-ref failed:"
+msgstr "Falló el update-ref:"
+
+#: lib/commit.tcl:460
+#, tcl-format
+msgid "Created commit %s: %s"
+msgstr "Creada la revisión %s: %s"
+
+#: lib/console.tcl:59
+msgid "Working... please wait..."
+msgstr "Trabajando... por favor espere..."
+
+#: lib/console.tcl:186
+msgid "Success"
+msgstr "Éxito"
+
+#: lib/console.tcl:200
+msgid "Error: Command Failed"
+msgstr "Error: El comando falló"
+
+#: lib/database.tcl:43
+msgid "Number of loose objects"
+msgstr "Número de objetos sueltos"
+
+#: lib/database.tcl:44
+msgid "Disk space used by loose objects"
+msgstr "Espacio en disco usado por objetos sueltos"
+
+#: lib/database.tcl:45
+msgid "Number of packed objects"
+msgstr "Número de objetos empaquetados"
+
+#: lib/database.tcl:46
+msgid "Number of packs"
+msgstr "Número de paquetes"
+
+#: lib/database.tcl:47
+msgid "Disk space used by packed objects"
+msgstr "Espacio en disco usado por objetos empaquetados"
+
+#: lib/database.tcl:48
+msgid "Packed objects waiting for pruning"
+msgstr "Objetos empaquetados esperando poda"
+
+#: lib/database.tcl:49
+msgid "Garbage files"
+msgstr "Ficheros basura"
+
+#: lib/database.tcl:72
+msgid "Compressing the object database"
+msgstr "Comprimiendo/Empaquetando la Base de Datos de objetos"
+
+#: lib/database.tcl:83
+msgid "Verifying the object database with fsck-objects"
+msgstr "Verificando la Base de Datos de objetos con fsck-objects"
+
+#: lib/database.tcl:108
+#, tcl-format
+msgid ""
+"This repository currently has approximately %i loose objects.\n"
+"\n"
+"To maintain optimal performance it is strongly recommended that you compress "
+"the database when more than %i loose objects exist.\n"
+"\n"
+"Compress the database now?"
+msgstr ""
+"Este repositorio cuenta actualmente con %i objetos sueltos.\n"
+"\n"
+"Para mantener un rendimento óptimo se recomienda encarecidamente\n"
+"que comprima la Base de Datos cuando hay mas de %i objetos sueltos.\n"
+"\n"
+"¿Comprimir la Base de Datos ahora?"
+
+#: lib/date.tcl:25
+#, tcl-format
+msgid "Invalid date from Git: %s"
+msgstr "Fecha inválida de Git: %s"
+
+#: lib/diff.tcl:59
+#, tcl-format
+msgid ""
+"No differences detected.\n"
+"\n"
+"%s has no changes.\n"
+"\n"
+"The modification date of this file was updated by another application, but "
+"the content within the file was not changed.\n"
+"\n"
+"A rescan will be automatically started to find other files which may have "
+"the same state."
+msgstr ""
+"Ninguna diferencia detectada.\n"
+"\n"
+"%s no tiene cambios.\n"
+"\n"
+"La fecha de modificacion ha sido cambiada por otra aplicación,\n"
+"pero los contenidos del fichero no han cambiado.\n"
+"\n"
+"Un rescaneo se realizará ahora para detectar otros ficheros en \n"
+"el mismo estado."
+
+#: lib/diff.tcl:99
+#, tcl-format
+msgid "Loading diff of %s..."
+msgstr "Cargando el diff de %s..."
+
+#: lib/diff.tcl:120
+msgid ""
+"LOCAL: deleted\n"
+"REMOTE:\n"
+msgstr ""
+"LOCAL: borrado\n"
+"REMOTO:\n"
+
+#: lib/diff.tcl:125
+msgid ""
+"REMOTE: deleted\n"
+"LOCAL:\n"
+msgstr ""
+"REMOTO: borrado\n"
+"LOCAL:\n"
+
+#: lib/diff.tcl:132
+msgid "LOCAL:\n"
+msgstr "LOCAL:\n"
+
+#: lib/diff.tcl:135
+msgid "REMOTE:\n"
+msgstr "REMOTO:\n"
+
+#: lib/diff.tcl:197 lib/diff.tcl:296
+#, tcl-format
+msgid "Unable to display %s"
+msgstr "Imposible mostrar %s"
+
+#: lib/diff.tcl:198
+msgid "Error loading file:"
+msgstr "Error cargando fichero:"
+
+#: lib/diff.tcl:205
+msgid "Git Repository (subproject)"
+msgstr "Repositorio Git (subproyecto)"
+
+#: lib/diff.tcl:217
+msgid "* Binary file (not showing content)."
+msgstr "* Fichero Binario (no se muestra contenido)."
+
+#: lib/diff.tcl:222
+#, tcl-format
+msgid ""
+"* Untracked file is %d bytes.\n"
+"* Showing only first %d bytes.\n"
+msgstr ""
+"* Fichero no registrado es de %d bytes.\n"
+"* Mostrando solo los primeros %d bytes.\n"
+
+#: lib/diff.tcl:228
+#, tcl-format
+msgid ""
+"\n"
+"* Untracked file clipped here by %s.\n"
+"* To see the entire file, use an external editor.\n"
+msgstr ""
+"\n"
+"* Fichero no registrado cortado aqui por %s.\n"
+"* Para ver el fichero completo, use un editor externo.\n"
+
+#: lib/diff.tcl:436
+msgid "Failed to unstage selected hunk."
+msgstr "Se falló al cancelar la preparacion para nueva revisión de la sección seleccionada."
+
+#: lib/diff.tcl:443
+msgid "Failed to stage selected hunk."
+msgstr "Se falló al preparar para nueva revisión la sección seleccionada."
+
+#: lib/diff.tcl:509
+msgid "Failed to unstage selected line."
+msgstr "Se falló al cancelar la preparación para nueva revisión de la linea seleccionada."
+
+#: lib/diff.tcl:517
+msgid "Failed to stage selected line."
+msgstr "Se falló al preparar para nueva revisón la linea seleccionada."
+
+#: lib/encoding.tcl:443
+msgid "Default"
+msgstr "Por defecto"
+
+#: lib/encoding.tcl:448
+#, tcl-format
+msgid "System (%s)"
+msgstr "Sistema (%s)"
+
+#: lib/encoding.tcl:459 lib/encoding.tcl:465
+msgid "Other"
+msgstr "Otro"
+
+#: lib/error.tcl:20 lib/error.tcl:114
+msgid "error"
+msgstr "error"
+
+#: lib/error.tcl:36
+msgid "warning"
+msgstr "advertencia"
+
+#: lib/error.tcl:94
+msgid "You must correct the above errors before committing."
+msgstr "Debe corregir los errores mostrados antes de crear nueva revisón."
+
+#: lib/index.tcl:6
+msgid "Unable to unlock the index."
+msgstr "Incapaz de desbloquear el índice (index)."
+
+#: lib/index.tcl:15
+msgid "Index Error"
+msgstr "Error del Índice"
+
+#: lib/index.tcl:21
+msgid ""
+"Updating the Git index failed.  A rescan will be automatically started to "
+"resynchronize git-gui."
+msgstr ""
+"Falló la actualización del índice. Un rescaneo comenzará ahora\n"
+"para resincronizar git-gui."
+
+#: lib/index.tcl:27
+msgid "Continue"
+msgstr "Continuar"
+
+#: lib/index.tcl:31
+msgid "Unlock Index"
+msgstr "Desbloquear Índice"
+
+#: lib/index.tcl:287
+#, tcl-format
+msgid "Unstaging %s from commit"
+msgstr "Cancelando la preparacion de %s de la revisón."
+
+#: lib/index.tcl:326
+msgid "Ready to commit."
+msgstr "Preparado para crear nueva revisión."
+
+#: lib/index.tcl:339
+#, tcl-format
+msgid "Adding %s"
+msgstr "Añadiendo %s"
+
+#: lib/index.tcl:396
+#, tcl-format
+msgid "Revert changes in file %s?"
+msgstr "¿Revertir los cambios en el fichero %s?"
+
+#: lib/index.tcl:398
+#, tcl-format
+msgid "Revert changes in these %i files?"
+msgstr "¿Revertir los cambios en estos %i ficheros?"
+
+#: lib/index.tcl:406
+msgid "Any unstaged changes will be permanently lost by the revert."
+msgstr "Cualquier cambio no preparado para nueva revisión se perderá al revertir."
+
+#: lib/index.tcl:409
+msgid "Do Nothing"
+msgstr "No hacer nada"
+
+#: lib/index.tcl:427
+msgid "Reverting selected files"
+msgstr "Revertiendo los ficheros seleccionados"
+
+#: lib/index.tcl:431
+#, tcl-format
+msgid "Reverting %s"
+msgstr "Revertiendo %s"
+
+#: lib/merge.tcl:13
+msgid ""
+"Cannot merge while amending.\n"
+"\n"
+"You must finish amending this commit before starting any type of merge.\n"
+msgstr ""
+"No se puede fusionar mientras se corrige.\n"
+"\n"
+"Debe terminar de corregir la revisión antes de comenzar cualquier tipo de fusión.\n"
+
+#: lib/merge.tcl:27
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before a merge can be performed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"El último estado escaneado no casa con el estado del repositorio.\n"
+"\n"
+"Otro programa de Git a modificado este repositorio desde el último escaneo.\n"
+"Un nuevo escaneo debe realizarse antes de que una nueva fusión pueda realizarse.\n"
+"\n"
+"El escaneo empezará automaticamente ahora.\n"
+
+#: lib/merge.tcl:45
+#, tcl-format
+msgid ""
+"You are in the middle of a conflicted merge.\n"
+"\n"
+"File %s has merge conflicts.\n"
+"\n"
+"You must resolve them, stage the file, and commit to complete the current "
+"merge.  Only then can you begin another merge.\n"
+msgstr ""
+"Esta en el medio de una fusión con conflictos.\n"
+"\n"
+"El fichero %s tiene conflictos.\n"
+"\n"
+"Debe resolverlos, preparar el fichero para nueva revisión, y crear\n"
+"la nueva revisión para completar la fusión. Solo asi podrá comenzar \n"
+"una nueva fusión.\n"
+
+#: lib/merge.tcl:55
+#, tcl-format
+msgid ""
+"You are in the middle of a change.\n"
+"\n"
+"File %s is modified.\n"
+"\n"
+"You should complete the current commit before starting a merge.  Doing so "
+"will help you abort a failed merge, should the need arise.\n"
+msgstr ""
+"Está en el medio de un cambio.\n"
+"\n"
+"El fichero %s ha sido modificado.\n"
+"\n"
+"Debería completar la revisión actual antes de comenzar la fusión.\n"
+"Hacer eso le ayudará a cancelar una fusión fallida si surgiese la \n"
+"necesidad.\n"
+
+#: lib/merge.tcl:107
+#, tcl-format
+msgid "%s of %s"
+msgstr "%s de %s"
+
+#: lib/merge.tcl:120
+#, tcl-format
+msgid "Merging %s and %s..."
+msgstr "Fusionando %s y %s..."
+
+#: lib/merge.tcl:131
+msgid "Merge completed successfully."
+msgstr "Fusión completada con éxito."
+
+#: lib/merge.tcl:133
+msgid "Merge failed.  Conflict resolution is required."
+msgstr "Fallo en la fusión. Se requiere resolución de conflictos."
+
+#: lib/merge.tcl:158
+#, tcl-format
+msgid "Merge Into %s"
+msgstr "Fusionar a %s"
+
+#: lib/merge.tcl:177
+msgid "Revision To Merge"
+msgstr "Revisión a Fusionar"
+
+#: lib/merge.tcl:212
+msgid ""
+"Cannot abort while amending.\n"
+"\n"
+"You must finish amending this commit.\n"
+msgstr ""
+"No se puede abortar durante la corrección.\n"
+"\n"
+"Debe terminar de corregir la revisión.\n"
+
+#: lib/merge.tcl:222
+msgid ""
+"Abort merge?\n"
+"\n"
+"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with aborting the current merge?"
+msgstr ""
+"¿Abortar fusión?\n"
+"\n"
+"Abortar la fusión actual causará la pérdida de *TODOS* los cambios no\n"
+"guardados en el repositorio.\n"
+"\n"
+"¿Continuar con la cancelación de la fusión actual?"
+
+#: lib/merge.tcl:228
+msgid ""
+"Reset changes?\n"
+"\n"
+"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with resetting the current changes?"
+msgstr ""
+"¿Revertir los cambios?\n"
+"\n"
+"Revertir los cambios provocará la pérdida de *TODOS* los cambios\n"
+"no guardados en el repositorio.\n"
+"\n"
+"¿Continuar y revertir los cambios actuales?"
+
+#: lib/merge.tcl:239
+msgid "Aborting"
+msgstr "Cancelando"
+
+#: lib/merge.tcl:239
+msgid "files reset"
+msgstr "ficheros revertidos"
+
+#: lib/merge.tcl:267
+msgid "Abort failed."
+msgstr "Falló la cancelación."
+
+#: lib/merge.tcl:269
+msgid "Abort completed.  Ready."
+msgstr "Cancelación completa. Preparado."
+
+#: lib/mergetool.tcl:8
+msgid "Force resolution to the base version?"
+msgstr "¿Forzar resolución a la version común (base)?"
+
+#: lib/mergetool.tcl:9
+msgid "Force resolution to this branch?"
+msgstr "¿Forzar resolución a la version de esta rama?"
+
+#: lib/mergetool.tcl:10
+msgid "Force resolution to the other branch?"
+msgstr "¿Forzar resolución a la version de la otra rama?"
+
+#: lib/mergetool.tcl:14
+#, tcl-format
+msgid ""
+"Note that the diff shows only conflicting changes.\n"
+"\n"
+"%s will be overwritten.\n"
+"\n"
+"This operation can be undone only by restarting the merge."
+msgstr ""
+"Tenga en cuenta que el parche solo muestra los cambios conflictivos.\n"
+"\n"
+"%s será sobrescrito.\n"
+"\n"
+"Esta operacion solo se puede deshacer reiniciando la fusión."
+
+#: lib/mergetool.tcl:45
+#, tcl-format
+msgid "File %s seems to have unresolved conflicts, still stage?"
+msgstr "El fichero %s parece que tiene conflictos no resueltos ¿preparar para nueva revisión igualmente?"
+
+#: lib/mergetool.tcl:60
+#, tcl-format
+msgid "Adding resolution for %s"
+msgstr "Añadiendo resolución para %s"
+
+#: lib/mergetool.tcl:141
+msgid "Cannot resolve deletion or link conflicts using a tool"
+msgstr "No se puede resolver el borrado o los conflictos de links con una herramienta"
+
+#: lib/mergetool.tcl:146
+msgid "Conflict file does not exist"
+msgstr "El fichero conflictivo no existe"
+
+#: lib/mergetool.tcl:264
+#, tcl-format
+msgid "Not a GUI merge tool: '%s'"
+msgstr "No es una herramienta de fusión gráfica: '%s'"
+
+#: lib/mergetool.tcl:268
+#, tcl-format
+msgid "Unsupported merge tool '%s'"
+msgstr "Herramienta de fusión no soportada '%s'"
+
+#: lib/mergetool.tcl:303
+msgid "Merge tool is already running, terminate it?"
+msgstr "La herramienta de fusión ya esta ejecutandose, ¿cerrarla? "
+
+#: lib/mergetool.tcl:323
+#, tcl-format
+msgid ""
+"Error retrieving versions:\n"
+"%s"
+msgstr ""
+"Error al traer las versiones:\n"
+"%s"
+
+#: lib/mergetool.tcl:343
+#, tcl-format
+msgid ""
+"Could not start the merge tool:\n"
+"\n"
+"%s"
+msgstr ""
+"No se pudo ejecutar la herramienta de fusión:\n"
+"\n"
+"%s "
+
+#: lib/mergetool.tcl:347
+msgid "Running merge tool..."
+msgstr "Ejecutando la herramienta de fusión..."
+
+#: lib/mergetool.tcl:375 lib/mergetool.tcl:383
+msgid "Merge tool failed."
+msgstr "La herramienta de fusión falló."
+
+#: lib/option.tcl:11
+#, tcl-format
+msgid "Invalid global encoding '%s'"
+msgstr "Codificación global inválida '%s'"
+
+#: lib/option.tcl:19
+#, tcl-format
+msgid "Invalid repo encoding '%s'"
+msgstr "Codificacion de repositorio inválida '%s'"
+
+#: lib/option.tcl:117
+msgid "Restore Defaults"
+msgstr "Restaurar opciones predeterminadas."
+
+#: lib/option.tcl:121
+msgid "Save"
+msgstr "Guardar"
+
+#: lib/option.tcl:131
+#, tcl-format
+msgid "%s Repository"
+msgstr "Repositorio %s"
+
+#: lib/option.tcl:132
+msgid "Global (All Repositories)"
+msgstr "Global (Todos los Repositorios)"
+
+#: lib/option.tcl:138
+msgid "User Name"
+msgstr "Nombre de Usuario"
+
+#: lib/option.tcl:139
+msgid "Email Address"
+msgstr "Dirección de e-mail."
+
+#: lib/option.tcl:141
+msgid "Summarize Merge Commits"
+msgstr "Resumir revisones de fusión"
+
+#: lib/option.tcl:142
+msgid "Merge Verbosity"
+msgstr "Verbosidad de la fusión"
+
+#: lib/option.tcl:143
+msgid "Show Diffstat After Merge"
+msgstr "Mostrar Diffstat tras la fusión"
+
+#: lib/option.tcl:144
+msgid "Use Merge Tool"
+msgstr "Usar herramienta de fusión"
+
+#: lib/option.tcl:146
+msgid "Trust File Modification Timestamps"
+msgstr "Fiarse de marca de tiempo de ficheros"
+
+#: lib/option.tcl:147
+msgid "Prune Tracking Branches During Fetch"
+msgstr "Podar las copias locales de ramas remotas al traer"
+
+#: lib/option.tcl:148
+msgid "Match Tracking Branches"
+msgstr "Casar los duplicados locales de ramas remotas"
+
+#: lib/option.tcl:149
+msgid "Blame Copy Only On Changed Files"
+msgstr "Detección de copia solo en ficheros cambiados"
+
+#: lib/option.tcl:150
+msgid "Minimum Letters To Blame Copy On"
+msgstr "Caracteres mínimos para activar detección de copia"
+
+#: lib/option.tcl:151
+msgid "Blame History Context Radius (days)"
+msgstr "Contexto de Cronología de Anotación (días)"
+
+#: lib/option.tcl:152
+msgid "Number of Diff Context Lines"
+msgstr "Número lineas de contexto en parches"
+
+#: lib/option.tcl:153
+msgid "Commit Message Text Width"
+msgstr "Ancho de texto en mensaje de revisión"
+
+#: lib/option.tcl:154
+msgid "New Branch Name Template"
+msgstr "Nombre Plantilla de Nueva Rama"
+
+#: lib/option.tcl:155
+msgid "Default File Contents Encoding"
+msgstr "Codificación por defecto de ficheros"
+
+#: lib/option.tcl:203
+msgid "Change"
+msgstr "Cambiar"
+
+#: lib/option.tcl:230
+msgid "Spelling Dictionary:"
+msgstr "Diccionario de corrección:"
+
+#: lib/option.tcl:254
+msgid "Change Font"
+msgstr "Cambiar fuente"
+
+#: lib/option.tcl:258
+#, tcl-format
+msgid "Choose %s"
+msgstr "Elija %s"
+
+#: lib/option.tcl:264
+msgid "pt."
+msgstr "pt."
+
+#: lib/option.tcl:278
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: lib/option.tcl:314
+msgid "Failed to completely save options:"
+msgstr "Fallo al guardar completamente las opciones:"
+
+#: lib/remote.tcl:163
+msgid "Remove Remote"
+msgstr "Borrar Remoto"
+
+#: lib/remote.tcl:168
+msgid "Prune from"
+msgstr "Podar de"
+
+#: lib/remote.tcl:173
+msgid "Fetch from"
+msgstr "Traer desde"
+
+#: lib/remote.tcl:215
+msgid "Push to"
+msgstr "Propagar a"
+
+#: lib/remote_add.tcl:19
+msgid "Add Remote"
+msgstr "Añadir remoto"
+
+#: lib/remote_add.tcl:24
+msgid "Add New Remote"
+msgstr "Añadir nuevo remoto"
+
+#: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36
+msgid "Add"
+msgstr "Añadir"
+
+#: lib/remote_add.tcl:37
+msgid "Remote Details"
+msgstr "Detalles del remoto"
+
+#: lib/remote_add.tcl:50
+msgid "Location:"
+msgstr "Localización:"
+
+#: lib/remote_add.tcl:62
+msgid "Further Action"
+msgstr "Más Acciones"
+
+#: lib/remote_add.tcl:65
+msgid "Fetch Immediately"
+msgstr "Traer inmediatamente"
+
+#: lib/remote_add.tcl:71
+msgid "Initialize Remote Repository and Push"
+msgstr "Inicializar repositorio remoto y propagar"
+
+#: lib/remote_add.tcl:77
+msgid "Do Nothing Else Now"
+msgstr "No hacer nada mas ahora"
+
+#: lib/remote_add.tcl:101
+msgid "Please supply a remote name."
+msgstr "Por favor indique un nombre para el remoto"
+
+#: lib/remote_add.tcl:114
+#, tcl-format
+msgid "'%s' is not an acceptable remote name."
+msgstr "'%s' es un nombre de remoto no aceptable."
+
+#: lib/remote_add.tcl:125
+#, tcl-format
+msgid "Failed to add remote '%s' of location '%s'."
+msgstr "Se falló al añadir el remoto '%s' de la localizacion '%s'."
+
+#: lib/remote_add.tcl:133 lib/transport.tcl:6
+#, tcl-format
+msgid "fetch %s"
+msgstr "traer %s"
+
+#: lib/remote_add.tcl:134
+#, tcl-format
+msgid "Fetching the %s"
+msgstr "Trayendo el %s"
+
+#: lib/remote_add.tcl:157
+#, tcl-format
+msgid "Do not know how to initialize repository at location '%s'."
+msgstr "No se sabe como inicializar el repositorio en localización '%s'."
+
+#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63
+#: lib/transport.tcl:81
+#, tcl-format
+msgid "push %s"
+msgstr "propagar %s"
+
+#: lib/remote_add.tcl:164
+#, tcl-format
+msgid "Setting up the %s (at %s)"
+msgstr "Creando %s (en %s)"
+
+#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
+msgid "Delete Branch Remotely"
+msgstr "Borrar rama remotamente"
+
+#: lib/remote_branch_delete.tcl:47
+msgid "From Repository"
+msgstr "Desde repositorio"
+
+#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134
+msgid "Remote:"
+msgstr "Remoto:"
+
+#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149
+msgid "Arbitrary Location:"
+msgstr "Localización arbitraria:"
+
+#: lib/remote_branch_delete.tcl:84
+msgid "Branches"
+msgstr "Ramas"
+
+#: lib/remote_branch_delete.tcl:109
+msgid "Delete Only If"
+msgstr "Borrar solo si"
+
+#: lib/remote_branch_delete.tcl:111
+msgid "Merged Into:"
+msgstr "Fusionado a:"
+
+#: lib/remote_branch_delete.tcl:119
+msgid "Always (Do not perform merge checks)"
+msgstr "Siempre (No hacer comprobaciones de fusión)"
+
+#: lib/remote_branch_delete.tcl:152
+msgid "A branch is required for 'Merged Into'."
+msgstr "Se requiere una rama para 'Fusionado a'."
+
+#: lib/remote_branch_delete.tcl:184
+#, tcl-format
+msgid ""
+"The following branches are not completely merged into %s:\n"
+"\n"
+" - %s"
+msgstr ""
+"Las siguientes ramas no están completamente fusionadas a %s:\n"
+"\n"
+"- %s"
+
+#: lib/remote_branch_delete.tcl:189
+#, tcl-format
+msgid ""
+"One or more of the merge tests failed because you have not fetched the "
+"necessary commits.  Try fetching from %s first."
+msgstr ""
+"Una o mas de las comprobaciones de fusión fallaron porque no se trajeron las\n"
+"revisones necesarias. Intente traerlas de %s primero."
+
+#: lib/remote_branch_delete.tcl:207
+msgid "Please select one or more branches to delete."
+msgstr "Por favor seleccione una o más ramas para borrar."
+
+#: lib/remote_branch_delete.tcl:216
+msgid ""
+"Recovering deleted branches is difficult.\n"
+"\n"
+"Delete the selected branches?"
+msgstr ""
+"Recuperar ramas borradas es difícil.\n"
+"\n"
+"¿Borrar las ramas seleccionadas?"
+
+#: lib/remote_branch_delete.tcl:226
+#, tcl-format
+msgid "Deleting branches from %s"
+msgstr "Borrando ramas de %s"
+
+#: lib/remote_branch_delete.tcl:286
+msgid "No repository selected."
+msgstr "No se ha seleccionado un repositorio."
+
+#: lib/remote_branch_delete.tcl:291
+#, tcl-format
+msgid "Scanning %s..."
+msgstr "Escaneando %s..."
+
+#: lib/search.tcl:21
+msgid "Find:"
+msgstr "Encontrar:"
+
+#: lib/search.tcl:23
+msgid "Next"
+msgstr "Siguiente"
+
+#: lib/search.tcl:24
+msgid "Prev"
+msgstr "Anterior"
+
+#: lib/search.tcl:25
+msgid "Case-Sensitive"
+msgstr "Sensible a Mayúsculas"
+
+#: lib/shortcut.tcl:20 lib/shortcut.tcl:61
+msgid "Cannot write shortcut:"
+msgstr "No se puede escribir el acceso directo:"
+
+#: lib/shortcut.tcl:136
+msgid "Cannot write icon:"
+msgstr "No se puede escribir el icono:"
+
+#: lib/spellcheck.tcl:57
+msgid "Unsupported spell checker"
+msgstr "Corrector ortográfico no soportado"
+
+#: lib/spellcheck.tcl:65
+msgid "Spell checking is unavailable"
+msgstr "Corrección ortográfica no disponible"
+
+#: lib/spellcheck.tcl:68
+msgid "Invalid spell checking configuration"
+msgstr "Configuración de corrección ortográfica inválida"
+
+#: lib/spellcheck.tcl:70
+#, tcl-format
+msgid "Reverting dictionary to %s."
+msgstr "Revertiendo diccionario a %s."
+
+#: lib/spellcheck.tcl:73
+msgid "Spell checker silently failed on startup"
+msgstr "El corrector ortográfico falló silenciosamente al arrancar"
+
+#: lib/spellcheck.tcl:80
+msgid "Unrecognized spell checker"
+msgstr "Corrector ortográfico no reconocido"
+
+#: lib/spellcheck.tcl:186
+msgid "No Suggestions"
+msgstr "No hay sugerencias"
+
+#: lib/spellcheck.tcl:388
+msgid "Unexpected EOF from spell checker"
+msgstr "EOF inesperado desde el corrector ortográfico"
+
+#: lib/spellcheck.tcl:392
+msgid "Spell Checker Failed"
+msgstr "Falló el corrector ortográfico"
+
+#: lib/sshkey.tcl:31
+msgid "No keys found."
+msgstr "No se encontraron llaves."
+
+#: lib/sshkey.tcl:34
+#, tcl-format
+msgid "Found a public key in: %s"
+msgstr "Encontrada llave pública en: %s"
+
+#: lib/sshkey.tcl:40
+msgid "Generate Key"
+msgstr "Generar Llave"
+
+#: lib/sshkey.tcl:56
+msgid "Copy To Clipboard"
+msgstr "Copiar al portapapeles"
+
+#: lib/sshkey.tcl:70
+msgid "Your OpenSSH Public Key"
+msgstr "Tu llave pública OpenSSH"
+
+#: lib/sshkey.tcl:78
+msgid "Generating..."
+msgstr "Generando..."
+
+#: lib/sshkey.tcl:84
+#, tcl-format
+msgid ""
+"Could not start ssh-keygen:\n"
+"\n"
+"%s"
+msgstr ""
+"No se pudo ejecutar ssh-keygen:\n"
+"\n"
+"%s"
+
+#: lib/sshkey.tcl:111
+msgid "Generation failed."
+msgstr "Falló la generación."
+
+#: lib/sshkey.tcl:118
+msgid "Generation succeded, but no keys found."
+msgstr "La generación tuvo éxito, pero no se encontraron llaves."
+
+#: lib/sshkey.tcl:121
+#, tcl-format
+msgid "Your key is in: %s"
+msgstr "Tu llave se encuentra en: %s"
+
+#: lib/status_bar.tcl:83
+#, tcl-format
+msgid "%s ... %*i of %*i %s (%3i%%)"
+msgstr "%s ... %*i de %*i %s (%3i%%)"
+
+#: lib/tools.tcl:75
+#, tcl-format
+msgid "Running %s requires a selected file."
+msgstr "Ejecutar %s requiere un fichero seleccionado."
+
+#: lib/tools.tcl:90
+#, tcl-format
+msgid "Are you sure you want to run %s?"
+msgstr "¿Está seguro de que quiere ejecutar %s?"
+
+#: lib/tools.tcl:110
+#, tcl-format
+msgid "Tool: %s"
+msgstr "Herramienta: %s"
+
+#: lib/tools.tcl:111
+#, tcl-format
+msgid "Running: %s"
+msgstr "Ejecutando: %s"
+
+#: lib/tools.tcl:149
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "Herramienta ejcutada con éxito: %s"
+
+#: lib/tools.tcl:151
+#, tcl-format
+msgid "Tool failed: %s"
+msgstr "Falló la herramienta: %s"
+
+#: lib/tools_dlg.tcl:22
+msgid "Add Tool"
+msgstr "Añadir Herramienta"
+
+#: lib/tools_dlg.tcl:28
+msgid "Add New Tool Command"
+msgstr "Añadir nuevo comando herramienta"
+
+#: lib/tools_dlg.tcl:33
+msgid "Add globally"
+msgstr "Añadir globalmente"
+
+#: lib/tools_dlg.tcl:45
+msgid "Tool Details"
+msgstr "Detalles de la herramienta"
+
+#: lib/tools_dlg.tcl:48
+msgid "Use '/' separators to create a submenu tree:"
+msgstr "Usar separadores '/' para crear un submenú en árbol:"
+
+#: lib/tools_dlg.tcl:61
+msgid "Command:"
+msgstr "Comando:"
+
+#: lib/tools_dlg.tcl:74
+msgid "Show a dialog before running"
+msgstr "Mostrar un dialogo antes de ejecutar"
+
+#: lib/tools_dlg.tcl:80
+msgid "Ask the user to select a revision (sets $REVISION)"
+msgstr "Pedir al usuario que seleccione una revisión (asigna $REVISION)"
+
+#: lib/tools_dlg.tcl:85
+msgid "Ask the user for additional arguments (sets $ARGS)"
+msgstr "Pedir al usuario argumentos adicionales (asigna $ARGS)"
+
+#: lib/tools_dlg.tcl:92
+msgid "Don't show the command output window"
+msgstr "No mostrar la ventana de salida de comandos"
+
+#: lib/tools_dlg.tcl:97
+msgid "Run only if a diff is selected ($FILENAME not empty)"
+msgstr "Ejecutar solo si se se ha seleccionado un diff ($FILENAME no vacio)"
+
+#: lib/tools_dlg.tcl:121
+msgid "Please supply a name for the tool."
+msgstr "Por favor indique un nombre para la herramienta"
+
+#: lib/tools_dlg.tcl:129
+#, tcl-format
+msgid "Tool '%s' already exists."
+msgstr "La herramienta '%s' ya existe."
+
+#: lib/tools_dlg.tcl:151
+#, tcl-format
+msgid ""
+"Could not add tool:\n"
+"%s"
+msgstr ""
+"No se pudo añadir la herramienta:\n"
+"%s"
+
+#: lib/tools_dlg.tcl:190
+msgid "Remove Tool"
+msgstr "Borrar herramienta"
+
+#: lib/tools_dlg.tcl:196
+msgid "Remove Tool Commands"
+msgstr "Borrar comandos herramienta"
+
+#: lib/tools_dlg.tcl:200
+msgid "Remove"
+msgstr "Borrar"
+
+#: lib/tools_dlg.tcl:236
+msgid "(Blue denotes repository-local tools)"
+msgstr "(Azul indica herramientas del repositoro local)"
+
+#: lib/tools_dlg.tcl:297
+#, tcl-format
+msgid "Run Command: %s"
+msgstr "Ejecutar comando: %s"
+
+#: lib/tools_dlg.tcl:311
+msgid "Arguments"
+msgstr "Argumentos"
+
+#: lib/tools_dlg.tcl:348
+msgid "OK"
+msgstr "OK"
+
+#: lib/transport.tcl:7
+#, tcl-format
+msgid "Fetching new changes from %s"
+msgstr "Trayendo cambios nuevos desde %s"
+
+#: lib/transport.tcl:18
+#, tcl-format
+msgid "remote prune %s"
+msgstr "poda remota %s"
+
+#: lib/transport.tcl:19
+#, tcl-format
+msgid "Pruning tracking branches deleted from %s"
+msgstr "Podando las copias locales de ramas remotas de %s"
+
+#: lib/transport.tcl:26
+#, tcl-format
+msgid "Pushing changes to %s"
+msgstr "Propagando cambios a %s"
+
+#: lib/transport.tcl:64
+#, tcl-format
+msgid "Mirroring to %s"
+msgstr "Haciendo Mirror en %s"
+
+#: lib/transport.tcl:82
+#, tcl-format
+msgid "Pushing %s %s to %s"
+msgstr "Propagando %s %s a %s"
+
+#: lib/transport.tcl:100
+msgid "Push Branches"
+msgstr "Propagar ramas"
+
+#: lib/transport.tcl:114
+msgid "Source Branches"
+msgstr "Ramas origen"
+
+#: lib/transport.tcl:131
+msgid "Destination Repository"
+msgstr "Repositorio de destino"
+
+#: lib/transport.tcl:169
+msgid "Transfer Options"
+msgstr "Operaciones de trasferencia"
+
+#: lib/transport.tcl:171
+msgid "Force overwrite existing branch (may discard changes)"
+msgstr "Sobrescritura forzada de ramas existentes (puede descartar cambios)"
+
+#: lib/transport.tcl:175
+msgid "Use thin pack (for slow network connections)"
+msgstr "Usar paquete ligero (para conexiones de red lentas)"
+
+#: lib/transport.tcl:179
+msgid "Include tags"
+msgstr "Incluir etiquetas"
-- 
1.7.0.rc1.34.gaafa7

^ permalink raw reply related

* Re: gitk translation updates needed?
From: Michele Ballabio @ 2010-02-03 20:56 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Paul Mackerras, git
In-Reply-To: <7vsk9ihzlp.fsf@alter.siamese.dyndns.org>

On Wednesday 03 February 2010, Junio C Hamano wrote:
> Michele Ballabio <barra_cuda@katamail.com> writes:
> 
> > On Wednesday 03 February 2010, Junio C Hamano wrote:
> >> Generating catalog po/it.msg
> >>  msgfmt --statistics --tcl po/it.po -l it -d po/
> >>  282 translated messages, 1 fuzzy translation, 6 untranslated messages.
> >
> > I don't get any fuzzy translation here, but I used to, so I guess it
> > regards the copyright message. If that's the case, maybe msgfmt
> > mishandles the (C)opyright sign (or maybe gitk uses a weird encoding,
> > I don't know).
> 
> Sorry, I omitted a step in my report:
> 
>  $ make po/gitk.pot
>  $ msgmerge -U po/it.po po/gitk.pot ;# and for other languages...
>  $ make po/it.msg

Yes, with these steps it.po now contains:

#: gitk:2782
#, fuzzy
msgid ""
"\n"
"Gitk - a commit viewer for git\n"
"\n"
"Copyright ©9 2005-2009 Paul Mackerras\n"
"\n"
"Use and redistribute under the terms of the GNU General Public License"

The "fuzzy" attribute is bogus but is understandable, because
the msgid changed: "©" became "©9". What I don't get is:
why "©" became "©9"? Was it a needed change or just an oversight?

^ permalink raw reply

* [gitolite] symlink hooks instead of copying them
From: martin f krafft @ 2010-02-03 20:47 UTC (permalink / raw)
  To: git discussion list, Sitaram Chamarty, Teemu Matilainen

[-- Attachment #1: Type: text/plain, Size: 869 bytes --]

Dear Sitaram, dear Teemo, dear gitolite-fans,

Gitolite currently copies hooks to repositories. For upgrades, it
must thus ensure that all hooks are also upgraded.

It occurs to me that this might be easier done using symlinks, or
with a file that includes the master hook(s) in
~/.gitolite/src/hooks. Then, the hooks just have to be upgraded in
one place.

Do you see a reason not to do this via symlinks?

-- 
 .''`.   martin f. krafft <madduck@d.o>      Related projects:
: :'  :  proud Debian developer               http://debiansystem.info
`. `'`   http://people.debian.org/~madduck    http://vcs-pkg.org
  `-  Debian - when you have better things to do than fixing systems
 
"we are trapped in the belly of this horrible machine,
 and the machine is bleeding to death."
                                        -- godspeed you black emperor!

[-- Attachment #2: Digital signature (see http://martin-krafft.net/gpg/) --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply

* Re: extra headers in commit objects
From: Shawn O. Pearce @ 2010-02-03 21:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: demerphq, Nicolas Pitre, git
In-Reply-To: <7vwryugifz.fsf@alter.siamese.dyndns.org>

Junio C Hamano <gitster@pobox.com> wrote:
> "Shawn O. Pearce" <spearce@spearce.org> writes:
> 
> > As I understand it, the current stance is:
> >
> > 1) A compliant Git implementation ignores any headers it doesn't
> >    recognize that appear *after* the optional "encoding" header.
> 
> I first read the above to mean that you need to add encoding if you want
> to throw in other garbage.
> 
> I would say "*after* the mandatory 'tree', 'parent' (0 or more), 'author',
> and 'committer' headers that must appear in this order", for clarity.

Yes, sorry, of course that is what I meant.  Thanks for the
clarification.

To add to that, "after encoding, if encoding is present".
 
> > 2) A compliant Git implementation does not produce any additional
> >    headers in a commit object, because other implementations cannot
> >    perform any machine based reasoning on them.
> >
> > 3) All implementations would (eventually) treat all headers equally,
> >    that is they all understand what author, committer, encoding are
> >    and process them the same way.  Any new headers should equally
> >    be fully cross-implementation.
> 
> These are very important points.
> 
> In your made-up example you added "bug" (presumably to mean "fixes this
> bug") and "message-id" ("am-ed from this message").  The latter might make
> sense, but the former does not belong to the header, as it is not a
> statement of the fact.

This all came out of what appears to be a tool to bridge another
VCS system data into Git.  Ala git-svn.

We all know that some other systems, e.g. SVN, permit adding
additional properties to commits, and that often these are used
to make statements like "Fixed bug NNNN", and bug tracking systems
integrate into SVN by reading or updating those properties.

So you, Nico, myself, might all agree that "bug" does not belong
in the header, but many others see it like SVN sees additional
properties on a revision, and thus it goes there.

Hence the artifical example.  It seems that it is not that artifical
outside of our mailing list.
 
> Forcing people to say "this fixes" at the commit time means you do not
> allow mistakes---it may turn out to be an incorrect or non fix later.

Yup, happens often.

> When you are amending the commit to say "this does not really fix it", you
> would want to lose the old "bug" header, but you would want to keep the
> "message-id" one.  There simply is not enough hint as to which ones must
> be carried across amending in the "we allow people to randomly throw extra
> headers into the commit object" model.  It is not a model--it is chaos.

Exactly.  That's what I had thought our position was, for exactly
this reason, it very quickly devolves into a chaos we can't reason
about, let alone write code to support for end-users.

> Also it wouldn't be obvious to other people what got changed while
> comparing two commits (before and after the amend) if the information is
> hidden in the header.  The right place for that kind of information is in
> the log message (if the nature of the information is for everybody to see)
> or in notes.

I'm afraid users might insert their own headers, then come report
the bug that `git log` and `git show` don't make those headers
visible when formatting the commit.  After all, they show the author
committer, and parent information when you use the right flags.

We'll of course say, its not in the message, and suggest using the
footer style like our Signed-off-by lines, or notes, which appear
below the message if requested.

> Introducing extra headers needs to be done _very_ carefully after thinking
> things through, judging the pros and cons.  Even though we kept the format
> open to allow us to extend the format to add essential statement of fact
> that we can make at the commit time (e.g. "encoding"), I do not foresee us
> adding any official extra headers in near future.

Right, me neither, because everything that has been proposed for an
extra header (e.g. bug id, Message-Id from the email it as git-amed
from, rename tracking, ...) has all been suggested to be better
positioned in the message itself, or in a note, or not at all...

-- 
Shawn.

^ permalink raw reply

* Re: extra headers in commit objects
From: Jelmer Vernooij @ 2010-02-03 20:58 UTC (permalink / raw)
  To: Shawn O. Pearce; +Cc: git
In-Reply-To: <20100203174041.GC14799@spearce.org>

[-- Attachment #1: Type: text/plain, Size: 3779 bytes --]

Hi Shawn,

On Wed, 2010-02-03 at 09:40 -0800, Shawn O. Pearce wrote:
> Am I correct that core C developers are still under the opinion
> that extra headers in a commit object aren't encouraged?
> 
> That is, we shouldn't see something like this made-up example:
> 
>   $ git cat-file commit HEAD
>   tree e0fb24d872e2daa1507ea5879e1cdce5c0da9902
>   parent ec0865178ad6d8dab9ccd82b07bc3f3dae20542a
>   parent 89d61592bddda4dfcb90314be9e06479f712bb7f
>   author Junio C Hamano <gitster@pobox.com> 1265176189 -0800
>   committer Junio C Hamano <gitster@pobox.com> 1265176189 -0800
>   bug 18389
>   url http://example.com/some/mailing/list/post
>   message-id <gitster-182819131@gitster.computer>
> 
>   Merge git://repo.or.cz/git-gui into next
> 
> (Sorry Junio for picking on your latest next merge...)

> Today I came across this "bug fix" [1,2] in Dulwich, which is
> claiming to be a pure-Python implementation of Git.
> 
> [1] http://git.samba.org/?p=jelmer/dulwich.git;a=commit;h=bc8d73f1146afba8828a7dadbb4320f592cddcab
> [2] http://git.samba.org/?p=jelmer/dulwich.git;a=commitdiff;h=bc8d73f1146afba8828a7dadbb4320f592cddcab;hp=4e50426fb72e6c9259feecbba5bfcf053af62335
> 
> I haven't spoken with Jelmer Vernooij directly about it, but after
> some indirect email through a 3rd party, it seems he might be under
> the impression that this really is a bug in Dulwich, because "other
> git implementations do it".
If you have concerns like this in the future, please don't hesitate to
contact me directly. I don't follow the git list because it's a
high-volume list where pretty much all traffic is irrelevant to me. The
only reason I became aware of this thread was because Sverre CC'ed me.

> Uhm.
Originally I was under the impression that custom headers would break
(by reading the C Git source code) and so Dulwich made that assumption,
but after hearing from several people (among whom Scott, see his reply)
at Linux.Conf.Au that custom headers could be added and were ignored by
C git I made this change.

Since Dulwich would blow up when it encountered custom headers that
might be set by other Git implements and since (as I understand) C git
ignores unknown headers, I called this a bug fix. This change made it
possible to deal with custom headers whenever they would appear *and*
allowed users of the Dulwich API to set custom headers. 

(FWIW I haven't actually seen anybody setting custom headers)

If this is indeed a misunderstanding, I'll happily make this
datastructure with custom headers read-only.

[...]
> Yes, there are many other Git implementations.  But I thought nearly
> all of them were toys, and none of them were even close to serving
> the kind of production volume that JGit serves, and JGit isn't even
> considered a production library by most.  Yet JGit always tries to
> conform to whatever standard is set by the C implementation.
So does Dulwich. I've fixed issues in the compatibility with C Git when
I've noticed them or have been made aware of them. Any incompatibilities
are the result of ignorance on my part rather than malicious intent.

[...]

> We're starting to see a fork in the basic protocols happen.  Hell,
> Dulwich 0.4.1 isn't even capable of speaking over the network to
> C Git, but it does talk to itself, so its valid, right?  :-(
I've been using Dulwich's client to talk to C Git servers for ages and
haven't seen issues. I would appreciate hearing about
incompatibilities. 

If you're talking about the server side - we know it's broken, at least
dul-daemon. Nobody (except for API changes) has really cared about it
since John Carr originally hacked it up. I'd be surprised if it even
works with the Dulwich client.

Cheers,

Jelmer

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* [PATCH] Documentation: clarify git-mv behaviour wrt dirty files
From: Thomas Rast @ 2010-02-03 21:12 UTC (permalink / raw)
  To: git; +Cc: Ron Garret, Avery Pennarun, Pete Harlan
In-Reply-To: <ron1-A681F2.12340503022010@news.gmane.org>

Clearly point out that the rename happens separately for worktree and
index.  This confused users, as they are apparently told that git-mv
== git-rm && mv && git-add, which it is not.

While there, move the synposis to the synopsis section, which so far
was rather useless, and reword the first sentence to eliminate the
mentions of 'script'.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
---

Ron, please don't drop the Cc lists, it's customary around here to Cc
everyone involved so far.

On Wednesday 03 February 2010 21:34:05 you wrote:
> In article <4B69D897.2060908@pcharlan.com>,
>  Pete Harlan <pgit@pcharlan.com> wrote:
> > Unlike "git rm", "git mv" could still perform the operation even without
> > "-f", but the semantics of "git mv" differ enough from plain "mv" that a
> > short blurb from Git in that case might help.
> 
> I think that a simple tweak to the docs would be enough.  Right now it 
> says:
> 
> "The index is updated after successful completion, but the change must 
> still be committed."
> 
> I'm pretty sure I would have been less confused if it had said something 
> like:
> 
> "The index is updated to reflect the new name of the file, but NOT any 
> new content that file may contain.  Changed content must be added to the 
> index separately with git add, and all changes must still be commited."

How about this change instead, which formulates it in terms of what
does happen, instead of what does not.

BTW, I'm wondering whether the "move or rename" distinction is really
worth it.  Does the user care?  I always figured it was a technical
detail whether rename() works or you actually need to move anything.


 Documentation/git-mv.txt |   14 +++++++-------
 1 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt
index bdcb585..eff11b7 100644
--- a/Documentation/git-mv.txt
+++ b/Documentation/git-mv.txt
@@ -8,22 +8,22 @@ git-mv - Move or rename a file, a directory, or a symlink
 
 SYNOPSIS
 --------
-'git mv' <options>... <args>...
+'git mv' [-f] [-n] <source> <destination>
+'git mv' [-f] [-n] [-k] <source>... <destination directory>
 
 DESCRIPTION
 -----------
-This script is used to move or rename a file, directory or symlink.
-
- git mv [-f] [-n] <source> <destination>
- git mv [-f] [-n] [-k] <source> ... <destination directory>
+'git-mv' renames files, directories, and symlinks in worktree and
+index.
 
 In the first form, it renames <source>, which must exist and be either
 a file, symlink or directory, to <destination>.
 In the second form, the last argument has to be an existing
 directory; the given sources will be moved into this directory.
 
-The index is updated after successful completion, but the change must still be
-committed.
+For every renamed file or symlink, the worktree and index contents are
+renamed separately, preserving both staged and unstaged changes.  You
+will still have to commit the rename.
 
 OPTIONS
 -------
-- 
1.7.0.rc1.166.g7cae7

^ permalink raw reply related

* Re: Using "git log" to find the files patched at the same time as a  named file
From: Zack Brown @ 2010-02-03 21:14 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <7vk4uughzf.fsf@alter.siamese.dyndns.org>

On Wed, Feb 3, 2010 at 3:52 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Zack Brown <zacharyb@gmail.com> writes:
>
>> If I have a filename I'm interested in, and I want to find other files
>> that have been modified in the same commits that modified the file I'm
>> interested in, how could I do that with git?
>
> Like this?
>
> $ git log --full-diff --name-status v1.6.0..master -- Makefile

Yes! Thank you!

I went back to the man page to see why I didn't find that before.
Here's the text for the --full-diff option:

   "Without this flag, "git log -p <path>..." shows commits that touch
   the specified paths, and diffs about the same specified paths. With
   this, the full diff is shown for commits that touch the specified
   paths; this means that "<path>..." limits only commits, and doesn’t
   limit diff for those commits."

That's all the text that deals with --full-diff in the git log
manpage. I'm not sure what it's trying to say - it seems really hard
to understand. What about something like this:

"Without this flag, "git log -p <path>..." shows commits that touch
the specified paths, but it only includes the diffs from those commits
that affected those specified paths, regardless of whether other paths
were changed in those same commits. With "git log --full-diff -p
<path>...", git still only reports commits that touch the specified
path, but now it also includes the diffs that affected any other paths
changed in those same commits."

Would that be an improvement?

Be well,
Zack

>
> to ask "Which files have changed in the commit that touch Makefile since
> v1.6.0 up to the tip of the master?"
>



-- 
Zack Brown

^ permalink raw reply

* Re: extra headers in commit objects
From: Nicolas Pitre @ 2010-02-03 21:17 UTC (permalink / raw)
  To: Jelmer Vernooij; +Cc: Shawn O. Pearce, git
In-Reply-To: <1265230702.7429.54.camel@ganieda>

On Wed, 3 Feb 2010, Jelmer Vernooij wrote:

> Since Dulwich would blow up when it encountered custom headers that
> might be set by other Git implements and since (as I understand) C git
> ignores unknown headers, I called this a bug fix. This change made it
> possible to deal with custom headers whenever they would appear *and*
> allowed users of the Dulwich API to set custom headers. 
> 
> (FWIW I haven't actually seen anybody setting custom headers)
> 
> If this is indeed a misunderstanding, I'll happily make this
> datastructure with custom headers read-only.

Please do so.

It is best to consider the Git note facility for the addition of such 
custom notations.  Notes can be attached to commits and changed at will 
while the commit objects themselves cannot (unless you rewrite history).


Nicolas

^ permalink raw reply

* Re: Using "git log" to find the files patched at the same time as a  named file
From: Junio C Hamano @ 2010-02-03 21:36 UTC (permalink / raw)
  To: Zack Brown; +Cc: git
In-Reply-To: <218b69371002031314rb52da81k92c45f79dc6feca@mail.gmail.com>

Zack Brown <zacharyb@gmail.com> writes:

> ... What about something like this:
>
> "Without this flag, "git log -p <path>..." shows commits that touch
> the specified paths, but it only includes the diffs from those commits

I would say "s/but/and/", because it is more natural that you get the
"limited" view after you explicitly stated that you are "only interested
in these things" by giving pathspecs.

> that affected those specified paths, regardless of whether other paths
> were changed in those same commits. With "git log --full-diff -p
> <path>...", git still only reports commits that touch the specified
> path, but now it also includes the diffs that affected any other paths
> changed in those same commits."

And "but" on the second line from the bottom makes sense---by giving the
option, you are telling it to work differently.

> Would that be an improvement?

Surely.  I would suspect that people would go even further.  "-p" is not
very special (notice I used --name-status in my example).

Also I think the description should start with what it _does_, not with
what happens without it.

So how about this?

diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index 0e39bb6..5dd1c0c 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -49,11 +49,14 @@ include::diff-options.txt[]
 	commit was reached.
 
 --full-diff::
-	Without this flag, "git log -p <path>..." shows commits that
-	touch the specified paths, and diffs about the same specified
-	paths.  With this, the full diff is shown for commits that touch
-	the specified paths; this means that "<path>..." limits only
-	commits, and doesn't limit diff for those commits.
+	Show all changes, even outside the given pathspecs.
++
+Pathspecs <path>... given to "git log [<options>] <path>..."  limit the
+output to the commits that touch the specified paths.  When options to
+show changes introduced by these commits (e.g. "-p", "--name-only") are
+given, the output of the changes are also limited to the specified paths.
+This option lifts the latter limit and tells "git log" to include all
+changes, even the ones outside of the given pathspecs.
 
 --follow::
 	Continue listing the history of a file beyond renames.

^ permalink raw reply related

* Re: is there a way to reference the branch point?
From: layer @ 2010-02-03 21:40 UTC (permalink / raw)
  To: Sverre Rabbelier; +Cc: git
In-Reply-To: <fabb9a1e1001291435p59599f62hd54cbca66d91c24b@mail.gmail.com>

Sverre Rabbelier <srabbelier@gmail.com> wrote:

>> Heya,
>> 
>> On Fri, Jan 29, 2010 at 23:29, layer <layer@known.net> wrote:
>> > If I make a branch `foo' off master, commit a bunch of times, is there
>> > a way to reference the place on master from which I branched?
>> 
>> Depends, if you make a new branch from master, you can use 'git
>> merge-base', so:
>> 
>> $ # on master
>> $ git checkout -b foo-topic-branch
>> $ # work work
>> $ git commit
>> $ # work work
>> $ git commit
>> 
>> Now you want to know where you branches off from master:
>> 
>> $ git merge-base foo-topic-branch master
>> 
>> That will show you the commit you branches off from, even if master
>> has grown new commits since then.

That works, but what if I don't know it's off master?  Normally, a
human would, but what if this is a script I'm writing?

Thanks.

Kevin

^ permalink raw reply

* Re: [PATCH] Documentation: clarify git-mv behaviour wrt dirty files
From: Junio C Hamano @ 2010-02-03 21:56 UTC (permalink / raw)
  To: Thomas Rast; +Cc: git, Ron Garret, Avery Pennarun, Pete Harlan
In-Reply-To: <c43166fa73391a40b43c27153ec142121fdb71d1.1265231310.git.trast@student.ethz.ch>

Thomas Rast <trast@student.ethz.ch> writes:

> Clearly point out that the rename happens separately for worktree and
> index.  This confused users, as they are apparently told that git-mv
> == git-rm && mv && git-add, which it is not.

I may be confused too as I had to read these three lines three times and I
do not think these two sentences mesh well together.

What happens with "git mv A B" is that it moves a work tree file A to B
and moves the index entry for A to B, hence all of:

 (1) the fact that you do not have A anymore;

 (2) the fact that you now have B instead; and

 (3) the fact that your work tree file B (which used to be A) has changes
     from its corresponding index entry

are _consistently_ kept between the work tree and the index.

I don't think "happens separately for" makes sense.  At best, it is an
implementation detail that doesn't help users understand what the command
does and what it is used for better.

Of course, it is different from

    "git rm -f --cached A && mv A B && git add B"

which would add changes that you were not prepared to add (i.e. you had
output from "git diff A" before you started).  I think that was a buggy
way old scripted version of "git mv" used to work, by the way.

> While there, move the synposis to the synopsis section, which so far
> was rather useless, and reword the first sentence to eliminate the
> mentions of 'script'.

That's a good change regardless.

> +For every renamed file or symlink, the worktree and index contents are
> +renamed separately, preserving both staged and unstaged changes....

I'd just say:

    While renaming paths, changes in the files in the work tree that you
    have not added are preserved.

> +....  You
> +will still have to commit the rename.

I don't understand why you want to say "You will still have to commit the
rename" here.  It is like saying in "git add" manpage that "You will still
have to commit the added contents" because "add" only affects the index
and does not make a commit.  Drop it.

^ permalink raw reply

* Re: Using "git log" to find the files patched at the same time as a  named file
From: Zack Brown @ 2010-02-03 21:52 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <7vfx5idmt2.fsf@alter.siamese.dyndns.org>

That looks much clearer. But I would change the final sentence to,
"This option lifts that limit and tells "git log" to include changes
from all paths that were affected by the outputted commits, not just
the changes from the paths specified on the command line."

Be well,
Zack

On Wed, Feb 3, 2010 at 4:36 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Zack Brown <zacharyb@gmail.com> writes:
>
>> ... What about something like this:
>>
>> "Without this flag, "git log -p <path>..." shows commits that touch
>> the specified paths, but it only includes the diffs from those commits
>
> I would say "s/but/and/", because it is more natural that you get the
> "limited" view after you explicitly stated that you are "only interested
> in these things" by giving pathspecs.
>
>> that affected those specified paths, regardless of whether other paths
>> were changed in those same commits. With "git log --full-diff -p
>> <path>...", git still only reports commits that touch the specified
>> path, but now it also includes the diffs that affected any other paths
>> changed in those same commits."
>
> And "but" on the second line from the bottom makes sense---by giving the
> option, you are telling it to work differently.
>
>> Would that be an improvement?
>
> Surely.  I would suspect that people would go even further.  "-p" is not
> very special (notice I used --name-status in my example).
>
> Also I think the description should start with what it _does_, not with
> what happens without it.
>
> So how about this?
>
> diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
> index 0e39bb6..5dd1c0c 100644
> --- a/Documentation/git-log.txt
> +++ b/Documentation/git-log.txt
> @@ -49,11 +49,14 @@ include::diff-options.txt[]
>        commit was reached.
>
>  --full-diff::
> -       Without this flag, "git log -p <path>..." shows commits that
> -       touch the specified paths, and diffs about the same specified
> -       paths.  With this, the full diff is shown for commits that touch
> -       the specified paths; this means that "<path>..." limits only
> -       commits, and doesn't limit diff for those commits.
> +       Show all changes, even outside the given pathspecs.
> ++
> +Pathspecs <path>... given to "git log [<options>] <path>..."  limit the
> +output to the commits that touch the specified paths.  When options to
> +show changes introduced by these commits (e.g. "-p", "--name-only") are
> +given, the output of the changes are also limited to the specified paths.
> +This option lifts the latter limit and tells "git log" to include all
> +changes, even the ones outside of the given pathspecs.
>
>  --follow::
>        Continue listing the history of a file beyond renames.
>
>
>



-- 
Zack Brown

^ permalink raw reply

* Re: gitk translation updates needed?
From: Paul Mackerras @ 2010-02-03 21:46 UTC (permalink / raw)
  To: Michele Ballabio; +Cc: Junio C Hamano, git
In-Reply-To: <201002032156.16101.barra_cuda@katamail.com>

On Wed, Feb 03, 2010 at 09:56:15PM +0100, Michele Ballabio wrote:

> The "fuzzy" attribute is bogus but is understandable, because
> the msgid changed: "©" became "©9". What I don't get is:
> why "©" became "©9"? Was it a needed change or just an oversight?

It crept in without me noticing in commit d93f1713 ("gitk: Use themed
tk widgets").  I'll fix it.

Paul.

^ permalink raw reply

* Re: gitk translation updates needed?
From: Junio C Hamano @ 2010-02-03 22:20 UTC (permalink / raw)
  To: Michele Ballabio; +Cc: Paul Mackerras, git
In-Reply-To: <201002032156.16101.barra_cuda@katamail.com>

Michele Ballabio <barra_cuda@katamail.com> writes:

>>  $ make po/gitk.pot
>>  $ msgmerge -U po/it.po po/gitk.pot ;# and for other languages...
>>  $ make po/it.msg
>
> Yes, with these steps it.po now contains:
>
> #: gitk:2782
> #, fuzzy
> msgid ""
> "\n"
> "Gitk - a commit viewer for git\n"
> "\n"
> "Copyright ©9 2005-2009 Paul Mackerras\n"
> "\n"
> "Use and redistribute under the terms of the GNU General Public License"
>
> The "fuzzy" attribute is bogus but is understandable, because
> the msgid changed: "©" became "©9". What I don't get is:
> why "©" became "©9"? Was it a needed change or just an oversight?

Very interesting.

The last commit that touched the copyright line in gitk was aa43561 (gitk:
Don't compare fake children when comparing commits, 2009-09-10) that
updated the years.  But the commit did not change the circle-c symbol at
all:

    $ git show --format='%H' -U1 aa43561a | head -n 10 | tail -n 2 | od -cx
    0000000   -   #       C   o   p   y   r   i   g   h   t     302 251    
            232d 4320 706f 7279 6769 7468 c220 20a9
    0000020   2   0   0   5   -   2   0   0   8       P   a   u   l       M
    ...
    0000100   +   #       C   o   p   y   r   i   g   h   t     302 251    
            232b 4320 706f 7279 6769 7468 c220 20a9
    0000120   2   0   0   5   -   2   0   0   9       P   a   u   l       M

"make po/gitk.pot" which is "xgettext -kmc -LTcl -o po/gitk.pot gitk"
however produces this:

    $ grep Paul po/gitk.pot | od -cx
    0000000   "   C   o   p   y   r   i   g   h   t     302 251   9       2
            4322 706f 7279 6769 7468 c220 39a9 3220
    0000020   0   0   5   -   2   0   0   9       P   a   u   l       M   a
    ...

Notice that "302 251 9"?

Is this a bug in "gettext", perhaps?

^ permalink raw reply

* Re: gitk translation updates needed?
From: Junio C Hamano @ 2010-02-03 22:21 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: Michele Ballabio, Junio C Hamano, git
In-Reply-To: <20100203214652.GE12487@brick.ozlabs.ibm.com>

Paul Mackerras <paulus@samba.org> writes:

> It crept in without me noticing in commit d93f1713 ("gitk: Use themed
> tk widgets").  I'll fix it.

Ahh, thanks.

^ permalink raw reply

* Re: gitk translation updates needed?
From: Junio C Hamano @ 2010-02-03 22:24 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Michele Ballabio, Paul Mackerras, git
In-Reply-To: <7v636ec677.fsf@alter.siamese.dyndns.org>

Junio C Hamano <gitster@pobox.com> writes:

> Is this a bug in "gettext", perhaps?

Scratch this; I was not reading the blame output correctly.

^ permalink raw reply

* Re: git-mv redux: there must be something else going on
From: Ron Garret @ 2010-02-03 22:33 UTC (permalink / raw)
  To: git
In-Reply-To: <32541b131002031240p6b67536ame6b69c6d662a7968@mail.gmail.com>

In article 
<32541b131002031240p6b67536ame6b69c6d662a7968@mail.gmail.com>,
 Avery Pennarun <apenwarr@gmail.com> wrote:

> On Wed, Feb 3, 2010 at 3:27 PM, Ron Garret <ron1@flownet.com> wrote:
> > So I think I'm beginning to understand how this works, but that leads me
> > to another question: it seems to me that there are potential screw cases
> > for this purely content-based system of tracking files.  For example,
> > suppose I have a directory full of sample config files, all of which are
> > similar to each other.  Will that cause diffcore to get confused?
> 
> Cases like that are always confusing, even to humans.  Person A
> renames X to Y, but at the same time creates Z which is almost
> identical.  Person B patches X, then merges in person A's changes.
> 
> What do you expect to happen?  Should Y be changed, because that's the
> file X was moved from?  Or should we change Z, because it's almost the
> same content anyway?  Or maybe we should change both, since a change
> to the old X is probably intended to affect the copied *content* that
> ended up in both Y and Z?
> 
> Simply storing whether person A has renamed vs. copied vs. added a
> file makes the answer to the "what do you expect to happen" question
> more obvious, but fails to answer the "what *should* happen" question.
>  Thus it's more of a distraction than a feature.  It took a while for
> me to accept this, but once I did, I realized that git's behaviour has
> still never caused me a problem in real life, despite repeated file
> renames and complicated merges.
> 
> In contrast, svn's explicit rename tracking has shot me in the foot
> numerous times.  (svn remembers when I delete file X and then
> subsequently re-add it with the same content.  So if I merge in
> someone's change to the *old* file X, it barfs because omg omg that's
> a totally different file X and it can't possibly figure out what to
> do.  Gee, thanks.  It's also hopelessly incompetent at handling
> "renames" in which a newbie developer didn't know to use svn mv, but
> instead used svn rm, mv, and svn add.)

Here's a realistic case where keeping explicit track of renames could be 
useful.

A and B start with a file named config.  A and B both make edits.  In 
addition, B renames config to be config1 and creates a new, very similar 
file called config2.  B then merges from A with the expectation that B's 
edits to config would end up in config1 and not config2.  It seems to me 
that without tracking renames, it would be luck of the draw which file 
the patch got applied to.

rg

^ permalink raw reply

* Re: extra headers in commit objects
From: Shawn O. Pearce @ 2010-02-03 22:39 UTC (permalink / raw)
  To: Jelmer Vernooij; +Cc: git
In-Reply-To: <1265230702.7429.54.camel@ganieda>

Jelmer Vernooij <jelmer@samba.org> wrote:
> On Wed, 2010-02-03 at 09:40 -0800, Shawn O. Pearce wrote:
> > 
> > I haven't spoken with Jelmer Vernooij directly about it, but after
> > some indirect email through a 3rd party, it seems he might be under
> > the impression that this really is a bug in Dulwich, because "other
> > git implementations do it".
>
> If you have concerns like this in the future, please don't hesitate to
> contact me directly.

OK.

> I don't follow the git list because it's a
> high-volume list where pretty much all traffic is irrelevant to me. The
> only reason I became aware of this thread was because Sverre CC'ed me.

I probably should have CC'd you in from the beginning, sorry.

Its true, this is a high-volume list.  But we don't see much, if
anything, about Dulwich here.  Yet I for one like to see discussion
about other implementations here, to some extent, so its easier
to make sure everyone is staying close to the C implementation's
reference standard.

> Originally I was under the impression that custom headers would break
> (by reading the C Git source code) and so Dulwich made that assumption,
> but after hearing from several people (among whom Scott, see his reply)
> at Linux.Conf.Au that custom headers could be added and were ignored by
> C git I made this change.

Yes, apparently Scott didn't quite represent things accurately.
Oh well, it seems its been raised now, and beaten to death.
 
> Since Dulwich would blow up when it encountered custom headers that
> might be set by other Git implements and since (as I understand) C git
> ignores unknown headers, I called this a bug fix.

That's true, and I'm glad you have made that change to Dulwich.  It is
a good bug fix to skip over headers you don't recognize.

But, its a new incompatible feature to support writing extra headers.

> If this is indeed a misunderstanding, I'll happily make this
> datastructure with custom headers read-only.

Yes.  Please see the other messages in this thread, especially from
Nico and Junio.  Setting other headers is not a good idea, and you
shouldn't encourage it in Dulwich by making an API available.
 
> > Yes, there are many other Git implementations.  But I thought nearly
> > all of them were toys, and none of them were even close to serving
> > the kind of production volume that JGit serves, and JGit isn't even
> > considered a production library by most.  Yet JGit always tries to
> > conform to whatever standard is set by the C implementation.
>
> So does Dulwich. I've fixed issues in the compatibility with C Git when
> I've noticed them or have been made aware of them. Any incompatibilities
> are the result of ignorance on my part rather than malicious intent.

I'm glad to hear that.

See above about keeping discussion related to other Git implementations
here.  We're happy to help explain something that is perhaps vague or
poorly specified.  Not everyone has the answer right away, but usually
the list fills in everything.
 
> > We're starting to see a fork in the basic protocols happen.  Hell,
> > Dulwich 0.4.1 isn't even capable of speaking over the network to
> > C Git, but it does talk to itself, so its valid, right?  :-(
>
> I've been using Dulwich's client to talk to C Git servers for ages and
> haven't seen issues. I would appreciate hearing about
> incompatibilities. 

OK, I haven't actually looked at the Dulwich client code...  so I
don't know what its current state is.
 
> If you're talking about the server side - we know it's broken, at least
> dul-daemon. Nobody (except for API changes) has really cared about it
> since John Carr originally hacked it up. I'd be surprised if it even
> works with the Dulwich client.

OK, then you may be interested in some of the patches my friend
Dave worked up (he said he was going to send them to you).
Dave discovered the server wasn't playing nice with C git, and
asked me for some protocol help to get it going again.

I'm glad its only an issue of neglect (lack of time) and not
something else that has caused it to be incompatible.

-- 
Shawn.

^ permalink raw reply

* Re: extra headers in commit objects
From: Shawn O. Pearce @ 2010-02-03 22:48 UTC (permalink / raw)
  To: Scott Chacon; +Cc: git
In-Reply-To: <d411cc4a1002031158k3e50db30l3f7d73d49e3dad23@mail.gmail.com>

Scott Chacon <schacon@gmail.com> wrote:
> On Wed, Feb 3, 2010 at 9:40 AM, Shawn O. Pearce <spearce@spearce.org> wrote:
> > Today I came across this "bug fix" [1,2] in Dulwich, which is
> > claiming to be a pure-Python implementation of Git.
> >
> > I haven't spoken with Jelmer Vernooij directly about it, but after
> > some indirect email through a 3rd party, it seems he might be under
> > the impression that this really is a bug in Dulwich, because "other
> > git implementations do it".
> 
> At the risk of pissing you off for the second time in as many days,
> this is entirely my fault.

Apparently, s**t happens is a good phrase.  One I need to learn.

> I was having a beer with Jelmer in Wellington a few weeks ago

And... beer doesn't promote clear thinking.

All is forgiven.  As is yesterday's remark about not telling me
sooner about a JGit bug.  You really didn't do anything bad, I
just woke up on the wrong side of the bed the past couple of days,
and sort of went off...

Sorry.  :-\

> Anyhow, I was saying that _technically_ you can artificially write
> extra headers into the commit object (though at the time Dulwich
> didn't support reading them because of how it parsed commit objects -
> I believe it would actually explode if it saw something it didn't
> expect).  I said I was still going to keep the metadata in my
> implementation in the message, but he was very interested in hiding
> his in the commit headers.

Yea, everyone wants to hide that extra metadata.  I never get why.
Even in SVN.  Why wouldn't I want to see the bug(s) fixed by
a commit?  Difference of opinion.  I also happen to prefer the
color blue.  Dammit, everyone should prefer blue.

> To my defense, we (you and I, Shawn)
> talked about this at the GitTogether this year and you and a few
> others told me that CGit would not blow up but would just ignore them,
> which is fine for his purposes.  I certainly did not get the
> impression from that short discussion that this was something to be
> absolutely avoided, but rather that it just wasn't really encouraged
> or explicitly supported.

Sorry.  I've held this same opinion as Junio and Nico have expressed
in this thread, that although we ignore extra headers, its only to
leave us an escape hatch in case we add something like "encoding"
in the future.  Adding encoding was almost a nightmare because we
didn't have that escape hatch.

I also hold the opinion that the C implementation is correct,
and everyone else is wrong.  Even JGit.  Unless its a bug in the
C implementation, in which case the bug fix is correct.  :-)

Which in this case means, if the C implementation doesn't give
the user plumbing to do something (aside from using git mkobject),
you really should think twice before doing it.

So I apologize if I gave you the wrong impression at the GitTogether.
I claim stupidity as my only defense.

> Sorry.  So, for future reference, though CGit _can_ handle it, don't?

C Git won't choke if there are extra headers.

But we _really_ don't want them.  And C Git won't be writing any new
headers anytime soon.  I think we're more likely to shift the entire
hashing scheme to SHA-512 or something before we add a new header.

-- 
Shawn.

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox