Git development
 help / color / mirror / Atom feed
* Git Gui: initial french translation: fr.po
From: Christian Couder @ 2008-01-15  5:24 UTC (permalink / raw)
  To: Shawn O. Pearce, Junio Hamano; +Cc: git

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

Here are some of the choices made to translate Git Gui to french:

- commit         -> "commit" (noun) or "commiter" (verb)
- stage (index)  -> "pré-commit" (noun) or "pré-commiter" (verb)
- (re)scan       -> "(re)synchroniser"
- reset          -> "réinitialiser"
- checkout       -> "emprunt" (noun) or "emprunter" (verb)
- revision expression -> "expression de révison"

I am not completely happy with these, but it's a start...

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---

I just attached the file instead of sending the patch because I fear
some encoding breakages.



[-- Attachment #2: fr.po --]
[-- Type: application/octet-stream, Size: 47936 bytes --]

# translation of fr.po to French
# Translation of git-gui to French.
# Copyright (C) 2008 Shawn Pearce, et al.
# This file is distributed under the same license as the git package.
#
# Christian Couder <chriscool@tuxfamily.org>, 2008.
msgid ""
msgstr ""
"Project-Id-Version: fr\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-11-24 10:36+0100\n"
"PO-Revision-Date: 2008-01-14 21:08+0100\n"
"Last-Translator: Christian Couder <chriscool@tuxfamily.org>\n"
"Language-Team: French\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms:  nplurals=2; plural=(n > 1);\n"

#: git-gui.sh:41 git-gui.sh:604 git-gui.sh:618 git-gui.sh:631 git-gui.sh:714
#: git-gui.sh:733
msgid "git-gui: fatal error"
msgstr "git-gui: erreur fatale"

#: git-gui.sh:565
#, tcl-format
msgid "Invalid font specified in %s:"
msgstr "Invalide fonte spécifiée dans %s :"

#: git-gui.sh:590
msgid "Main Font"
msgstr "Fonte principale"

#: git-gui.sh:591
msgid "Diff/Console Font"
msgstr "Fonte diff/console"

#: git-gui.sh:605
msgid "Cannot find git in PATH."
msgstr "Impossible de trouver git dans PATH."

#: git-gui.sh:632
msgid "Cannot parse Git version string:"
msgstr "Impossible de parser la version de Git :"

#: git-gui.sh:650
#, 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 ""
"Impossible de déterminer la version de Git.\n"
"\n"
"%s affirme qu'il s'agit de la version '%s'.\n"
"\n"
"%s nécessite au moins Git 1.5.0.\n"
"\n"
"Peut'on considérer que '%s' est en version 1.5.0 ?\n"

#: git-gui.sh:888
msgid "Git directory not found:"
msgstr "Impossible de trouver le répertoire de Git :"

#: git-gui.sh:895
msgid "Cannot move to top of working directory:"
msgstr "Impossible d'aller à la racine du répertoire de travail :"

#: git-gui.sh:902
msgid "Cannot use funny .git directory:"
msgstr "Impossible d'utiliser un drôle de répertoire git :"

#: git-gui.sh:907
msgid "No working directory"
msgstr "Pas de répertoire de travail"

#: git-gui.sh:1054
msgid "Refreshing file status..."
msgstr "Rafraichissement du status des fichiers..."

#: git-gui.sh:1119
msgid "Scanning for modified files ..."
msgstr "Recherche de fichiers modifiés..."

#: git-gui.sh:1294 lib/browser.tcl:245
msgid "Ready."
msgstr "Prêt."

#: git-gui.sh:1560
msgid "Unmodified"
msgstr "Non modifié"

#: git-gui.sh:1562
msgid "Modified, not staged"
msgstr "Modifié, non pré-commité"

#: git-gui.sh:1563 git-gui.sh:1568
msgid "Staged for commit"
msgstr "Pré-commité"

#: git-gui.sh:1564 git-gui.sh:1569
msgid "Portions staged for commit"
msgstr "En partie pré-commité"

#: git-gui.sh:1565 git-gui.sh:1570
msgid "Staged for commit, missing"
msgstr "Pré-commité, manquant"

#: git-gui.sh:1567
msgid "Untracked, not staged"
msgstr "Non suivi, non pré-commité"

#: git-gui.sh:1572
msgid "Missing"
msgstr "Manquant"

#: git-gui.sh:1573
msgid "Staged for removal"
msgstr "Pré-commité pour suppression"

#: git-gui.sh:1574
msgid "Staged for removal, still present"
msgstr "Pré-commité pour suppression, toujours présent"

#: git-gui.sh:1576 git-gui.sh:1577 git-gui.sh:1578 git-gui.sh:1579
msgid "Requires merge resolution"
msgstr "Nécessite la résolution d'une fusion"

#: git-gui.sh:1614
msgid "Starting gitk... please wait..."
msgstr "Lancement de gitk... merci de patienter..."

#: git-gui.sh:1623
#, tcl-format
msgid ""
"Unable to start gitk:\n"
"\n"
"%s does not exist"
msgstr ""
"Impossible de lancer gitk :\n"
"\n"
"%s inexistant"

#: git-gui.sh:1823 lib/choose_repository.tcl:35
msgid "Repository"
msgstr "Référentiel"

#: git-gui.sh:1824
msgid "Edit"
msgstr "Editer"

#: git-gui.sh:1826 lib/choose_rev.tcl:560
msgid "Branch"
msgstr "Branche"

#: git-gui.sh:1829 lib/choose_rev.tcl:547
msgid "Commit@@noun"
msgstr "Commit"

#: git-gui.sh:1832 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
msgid "Merge"
msgstr "Fusionner"

#: git-gui.sh:1833 lib/choose_rev.tcl:556
msgid "Remote"
msgstr "Référentiel distant"

#: git-gui.sh:1842
msgid "Browse Current Branch's Files"
msgstr "Visionner fichiers dans branche courante"

#: git-gui.sh:1846
msgid "Browse Branch Files..."
msgstr "Visionner fichiers de branche"

#: git-gui.sh:1851
msgid "Visualize Current Branch's History"
msgstr "Visualiser historique branche courante"

#: git-gui.sh:1855
msgid "Visualize All Branch History"
msgstr "Visualiser historique toutes branches"

#: git-gui.sh:1862
#, tcl-format
msgid "Browse %s's Files"
msgstr "Visionner fichiers de %s"

#: git-gui.sh:1864
#, tcl-format
msgid "Visualize %s's History"
msgstr "Visualiser historique de %s"

#: git-gui.sh:1869 lib/database.tcl:27 lib/database.tcl:67
msgid "Database Statistics"
msgstr "Statistiques base de donnée"

#: git-gui.sh:1872 lib/database.tcl:34
msgid "Compress Database"
msgstr "Comprimer base de donnée"

#: git-gui.sh:1875
msgid "Verify Database"
msgstr "Vérifier base de donnée"

#: git-gui.sh:1882 git-gui.sh:1886 git-gui.sh:1890 lib/shortcut.tcl:7
#: lib/shortcut.tcl:39 lib/shortcut.tcl:71
msgid "Create Desktop Icon"
msgstr "Créer icône sur bureau"

#: git-gui.sh:1895 lib/choose_repository.tcl:176 lib/choose_repository.tcl:184
msgid "Quit"
msgstr "Quitter"

#: git-gui.sh:1902
msgid "Undo"
msgstr "Défaire"

#: git-gui.sh:1905
msgid "Redo"
msgstr "Refaire"

#: git-gui.sh:1909 git-gui.sh:2403
msgid "Cut"
msgstr "Couper"

#: git-gui.sh:1912 git-gui.sh:2406 git-gui.sh:2477 git-gui.sh:2549
#: lib/console.tcl:67
msgid "Copy"
msgstr "Copier"

#: git-gui.sh:1915 git-gui.sh:2409
msgid "Paste"
msgstr "Coller"

#: git-gui.sh:1918 git-gui.sh:2412 lib/branch_delete.tcl:26
#: lib/remote_branch_delete.tcl:38
msgid "Delete"
msgstr "Supprimer"

#: git-gui.sh:1922 git-gui.sh:2416 git-gui.sh:2553 lib/console.tcl:69
msgid "Select All"
msgstr "Tout sélectionner"

#: git-gui.sh:1931
msgid "Create..."
msgstr "Créer..."

#: git-gui.sh:1937
msgid "Checkout..."
msgstr "Emprunter... "

#: git-gui.sh:1943
msgid "Rename..."
msgstr "Renommer..."

#: git-gui.sh:1948 git-gui.sh:2048
msgid "Delete..."
msgstr "Supprimer..."

#: git-gui.sh:1953
msgid "Reset..."
msgstr "Réinitialiser..."

#: git-gui.sh:1965 git-gui.sh:2350
msgid "New Commit"
msgstr "Nouveau commit"

#: git-gui.sh:1973 git-gui.sh:2357
msgid "Amend Last Commit"
msgstr "Corriger dernier commit"

#: git-gui.sh:1982 git-gui.sh:2317 lib/remote_branch_delete.tcl:99
msgid "Rescan"
msgstr "Resynchroniser"

#: git-gui.sh:1988
msgid "Stage To Commit"
msgstr "Commiter un pré-commit"

#: git-gui.sh:1994
msgid "Stage Changed Files To Commit"
msgstr "Commiter fichiers modifiés dans pré-commit"

#: git-gui.sh:2000
msgid "Unstage From Commit"
msgstr "Commit vers pré-commit"

#: git-gui.sh:2005 lib/index.tcl:393
msgid "Revert Changes"
msgstr "Inverser modification"

#: git-gui.sh:2012 git-gui.sh:2329 git-gui.sh:2427
msgid "Sign Off"
msgstr "Se désinscrire"

#: git-gui.sh:2016 git-gui.sh:2333
msgid "Commit@@verb"
msgstr "Commiter"

#: git-gui.sh:2027
msgid "Local Merge..."
msgstr "Fusion locale..."

#: git-gui.sh:2032
msgid "Abort Merge..."
msgstr "Abandonner fusion..."

#: git-gui.sh:2044
msgid "Push..."
msgstr "Pousser..."

#: git-gui.sh:2055 lib/choose_repository.tcl:40
msgid "Apple"
msgstr "Pomme"

#: git-gui.sh:2058 git-gui.sh:2080 lib/about.tcl:13
#: lib/choose_repository.tcl:43 lib/choose_repository.tcl:49
#, tcl-format
msgid "About %s"
msgstr "A propos de %s"

#: git-gui.sh:2062
msgid "Preferences..."
msgstr "Préférences..."

#: git-gui.sh:2070 git-gui.sh:2595
msgid "Options..."
msgstr "Options..."

#: git-gui.sh:2076 lib/choose_repository.tcl:46
msgid "Help"
msgstr "Aide"

#: git-gui.sh:2117
msgid "Online Documentation"
msgstr "Documentation en ligne"

#: git-gui.sh:2201
#, tcl-format
msgid "fatal: cannot stat path %s: No such file or directory"
msgstr "fatale : pas d'infos sur le chemin %s : Fichier ou répertoire inexistant"

#: git-gui.sh:2234
msgid "Current Branch:"
msgstr "Branche courante :"

#: git-gui.sh:2255
msgid "Staged Changes (Will Commit)"
msgstr "Modifications pré-commitées"

#: git-gui.sh:2274
msgid "Unstaged Changes"
msgstr "Modifications non pré-commitées"

#: git-gui.sh:2323
msgid "Stage Changed"
msgstr "Pré-commit modifié"

#: git-gui.sh:2339 lib/transport.tcl:93 lib/transport.tcl:182
msgid "Push"
msgstr "Pousser"

#: git-gui.sh:2369
msgid "Initial Commit Message:"
msgstr "Message de commit initial :"

#: git-gui.sh:2370
msgid "Amended Commit Message:"
msgstr "Message de commit corrigé :"

#: git-gui.sh:2371
msgid "Amended Initial Commit Message:"
msgstr "Message de commit initial corrigé :"

#: git-gui.sh:2372
msgid "Amended Merge Commit Message:"
msgstr "Message de commit de fusion corrigé :"

#: git-gui.sh:2373
msgid "Merge Commit Message:"
msgstr "Message de commit de fusion :"

#: git-gui.sh:2374
msgid "Commit Message:"
msgstr "Message de commit :"

#: git-gui.sh:2419 git-gui.sh:2557 lib/console.tcl:71
msgid "Copy All"
msgstr "Copier tout"

#: git-gui.sh:2443 lib/blame.tcl:104
msgid "File:"
msgstr "Fichier :"

#: git-gui.sh:2545
msgid "Refresh"
msgstr "Rafraichir"

#: git-gui.sh:2566
msgid "Apply/Reverse Hunk"
msgstr "Appliquer/Inverser section"

#: git-gui.sh:2572
msgid "Decrease Font Size"
msgstr "Réduire fonte"

#: git-gui.sh:2576
msgid "Increase Font Size"
msgstr "Agrandir fonte"

#: git-gui.sh:2581
msgid "Show Less Context"
msgstr "Montrer moins de contexte"

#: git-gui.sh:2588
msgid "Show More Context"
msgstr "Montrer plus de contexte"

#: git-gui.sh:2602
msgid "Unstage Hunk From Commit"
msgstr "Enlever section pré-commitée"

#: git-gui.sh:2604
msgid "Stage Hunk For Commit"
msgstr "Pré-commiter section"

#: git-gui.sh:2623
msgid "Initializing..."
msgstr "Initialisation..."

#: git-gui.sh:2718
#, 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 ""
"Des problèmes d'environnement sont possibles.\n"
"\n"
"Les variables d'environnement suivantes seront\n"
"probablement ignorées par tous les\n"
"sous-processus de Git lancés par %s\n"
"\n"

#: git-gui.sh:2748
msgid ""
"\n"
"This is due to a known issue with the\n"
"Tcl binary distributed by Cygwin."
msgstr ""
"\n"
"Ceci est du à un problème connu avec\n"
"le binaire Tcl distribué par Cygwin."

#: git-gui.sh:2753
#, 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"
"Un bon remplacement pour %s\n"
"est de mettre les valeurs pour 'user.name' (nom\n"
"de l'utilisateur) et 'user.email' (addresse email\n"
"de l'utilisateur) dans votre fichier '~/.gitconfig'."

#: lib/about.tcl:25
msgid "git-gui - a graphical user interface for Git."
msgstr "git-gui - une interface graphique utilisateur pour Git"

#: lib/blame.tcl:77
msgid "File Viewer"
msgstr "Visionneur de fichier"

#: lib/blame.tcl:81
msgid "Commit:"
msgstr "Commit :"

#: lib/blame.tcl:249
msgid "Copy Commit"
msgstr "Copier commit"

#: lib/blame.tcl:369
#, tcl-format
msgid "Reading %s..."
msgstr "Lecture de %s..."

#: lib/blame.tcl:473
msgid "Loading copy/move tracking annotations..."
msgstr "Chargement des annotations de suivi des copies/déplacements..."

#: lib/blame.tcl:493
msgid "lines annotated"
msgstr "lignes annotées"

#: lib/blame.tcl:674
msgid "Loading original location annotations..."
msgstr "Chargement des annotations d'emplacement original"

#: lib/blame.tcl:677
msgid "Annotation complete."
msgstr "Annotation terminée."

#: lib/blame.tcl:731
msgid "Loading annotation..."
msgstr "Chargement des annotations..."

#: lib/blame.tcl:787
msgid "Author:"
msgstr "Auteur :"

#: lib/blame.tcl:791
msgid "Committer:"
msgstr "Commiteur :"

#: lib/blame.tcl:796
msgid "Original File:"
msgstr "Fichier original :"

#: lib/blame.tcl:910
msgid "Originally By:"
msgstr "A l'origine par :"

#: lib/blame.tcl:916
msgid "In File:"
msgstr "Dans le fichier :"

#: lib/blame.tcl:921
msgid "Copied Or Moved Here By:"
msgstr "Copié ou déplacé ici par :"

#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
msgid "Checkout Branch"
msgstr "Emprunter branche"

#: lib/branch_checkout.tcl:23
msgid "Checkout"
msgstr "Emprunter"

#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35
#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281
#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172
#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97
msgid "Cancel"
msgstr "Annuler"

#: lib/branch_checkout.tcl:32 lib/browser.tcl:286
msgid "Revision"
msgstr "Révision"

#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202
msgid "Options"
msgstr "Options"

#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92
msgid "Fetch Tracking Branch"
msgstr "Branche suivant récupération"

#: lib/branch_checkout.tcl:44
msgid "Detach From Local Branch"
msgstr "Détacher de branche locale"

#: lib/branch_create.tcl:22
msgid "Create Branch"
msgstr "Créer branche"

#: lib/branch_create.tcl:27
msgid "Create New Branch"
msgstr "Créer nouvelle branche"

#: lib/branch_create.tcl:31 lib/choose_repository.tcl:375
msgid "Create"
msgstr "Créer"

#: lib/branch_create.tcl:40
msgid "Branch Name"
msgstr "Nom de branche"

#: lib/branch_create.tcl:43
msgid "Name:"
msgstr "Nom :"

#: lib/branch_create.tcl:58
msgid "Match Tracking Branch Name"
msgstr "Trouver nom de branche de suivi"

#: lib/branch_create.tcl:66
msgid "Starting Revision"
msgstr "Début de révision"

#: lib/branch_create.tcl:72
msgid "Update Existing Branch:"
msgstr "Mettre à jour branche existante :"

#: lib/branch_create.tcl:75
msgid "No"
msgstr "Non"

#: lib/branch_create.tcl:80
msgid "Fast Forward Only"
msgstr "Avance rapide seulement"

#: lib/branch_create.tcl:85 lib/checkout_op.tcl:514
msgid "Reset"
msgstr "Réinitialiser"

#: lib/branch_create.tcl:97
msgid "Checkout After Creation"
msgstr "Emprunt après création"

#: lib/branch_create.tcl:131
msgid "Please select a tracking branch."
msgstr "Merci de choisir une branche de suivi"

#: lib/branch_create.tcl:140
#, tcl-format
msgid "Tracking branch %s is not a branch in the remote repository."
msgstr "La branche de suivi %s n'est pas une branche dans le référentiel distant."

#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86
msgid "Please supply a branch name."
msgstr "Merci de fournir un nom de branche."

#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106
#, tcl-format
msgid "'%s' is not an acceptable branch name."
msgstr "'%s' n'est pas un nom de branche acceptable."

#: lib/branch_delete.tcl:15
msgid "Delete Branch"
msgstr "Supprimer branche"

#: lib/branch_delete.tcl:20
msgid "Delete Local Branch"
msgstr "Supprimer branche locale"

#: lib/branch_delete.tcl:37
msgid "Local Branches"
msgstr "Branches locales"

#: lib/branch_delete.tcl:52
msgid "Delete Only If Merged Into"
msgstr "Supprimer ssi fusion dedans"

#: lib/branch_delete.tcl:54
msgid "Always (Do not perform merge test.)"
msgstr "Toujours (Ne pas faire de test de fusion.)"

#: lib/branch_delete.tcl:103
#, tcl-format
msgid "The following branches are not completely merged into %s:"
msgstr "Les branches suivantes ne sont pas complètement fusionnées dans %s :"

#: lib/branch_delete.tcl:115
msgid ""
"Recovering deleted branches is difficult. \n"
"\n"
" Delete the selected branches?"
msgstr ""
"Récupérer des branches supprimées est difficile.\n"
"\n"
"Supprimer les branches sélectionnées ?"

#: lib/branch_delete.tcl:141
#, tcl-format
msgid ""
"Failed to delete branches:\n"
"%s"
msgstr ""
"La suppression des branches suivantes a échouée :\n"
"%s"

#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22
msgid "Rename Branch"
msgstr "Renommer branche"

#: lib/branch_rename.tcl:26
msgid "Rename"
msgstr "Renommer"

#: lib/branch_rename.tcl:36
msgid "Branch:"
msgstr "Branche :"

#: lib/branch_rename.tcl:39
msgid "New Name:"
msgstr "Nouveau nom :"

#: lib/branch_rename.tcl:75
msgid "Please select a branch to rename."
msgstr "Merci de sélectionner une branche à renommer."

#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179
#, tcl-format
msgid "Branch '%s' already exists."
msgstr "La branche '%s' existe déjà."

#: lib/branch_rename.tcl:117
#, tcl-format
msgid "Failed to rename '%s'."
msgstr "Le renommage de '%s' a échoué."

#: lib/browser.tcl:17
msgid "Starting..."
msgstr "Lancement..."

#: lib/browser.tcl:26
msgid "File Browser"
msgstr "Visionneur de fichier"

#: lib/browser.tcl:125 lib/browser.tcl:142
#, tcl-format
msgid "Loading %s..."
msgstr "Chargement de %s..."

#: lib/browser.tcl:186
msgid "[Up To Parent]"
msgstr "[Jusqu'au parent]"

#: lib/browser.tcl:266 lib/browser.tcl:272
msgid "Browse Branch Files"
msgstr "Visionner fichiers de branches"

#: lib/browser.tcl:277 lib/choose_repository.tcl:391
#: lib/choose_repository.tcl:482 lib/choose_repository.tcl:492
#: lib/choose_repository.tcl:989
msgid "Browse"
msgstr "Visionner"

#: lib/checkout_op.tcl:79
#, tcl-format
msgid "Fetching %s from %s"
msgstr "Récupération de %s à partir de %s"

#: lib/checkout_op.tcl:127
#, tcl-format
msgid "fatal: Cannot resolve %s"
msgstr "Erreur fatale : Impossible de résoudre %s"

#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31
msgid "Close"
msgstr "Fermer"

#: lib/checkout_op.tcl:169
#, tcl-format
msgid "Branch '%s' does not exist."
msgstr "La branche '%s' n'existe pas."

#: lib/checkout_op.tcl:206
#, tcl-format
msgid ""
"Branch '%s' already exists.\n"
"\n"
"It cannot fast-forward to %s.\n"
"A merge is required."
msgstr ""
"La branche '%s' existe déjà.\n"
"\n"
"Impossible d'avancer rapidement à %s.\n"
"Une fusion est nécessaire."

#: lib/checkout_op.tcl:220
#, tcl-format
msgid "Merge strategy '%s' not supported."
msgstr "La stratégie de fusion '%s' n'est pas supportée."

#: lib/checkout_op.tcl:239
#, tcl-format
msgid "Failed to update '%s'."
msgstr "La mise à jour de '%s' a échouée."

#: lib/checkout_op.tcl:251
msgid "Staging area (index) is already locked."
msgstr "L'espace de pré-commit ('index' ou 'staging') est déjà vérouillé."

#: lib/checkout_op.tcl:266
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 ""
"L'état lors de la dernière synchronisation ne correspond plus à l'état du référentiel.\n"
"\n"
"Un autre programme Git a modifié ce référentiel depuis la dernière synchronisation. Une resynchronisation doit être effectuée avant de pouvoir modifier la branche courante.\n"
"\n"
"Cela va être fait tout de suite automatiquement.\n"

#: lib/checkout_op.tcl:322
#, tcl-format
msgid "Updating working directory to '%s'..."
msgstr "Mise à jour du répertoire courant avec '%s'..."

#: lib/checkout_op.tcl:353
#, tcl-format
msgid "Aborted checkout of '%s' (file level merging is required)."
msgstr "Emprunt de '%s' abandonné. (Il est nécessaire de fusionner des fichiers.)"

#: lib/checkout_op.tcl:354
msgid "File level merge required."
msgstr "Il est nécessaire de fusionner des fichiers."

#: lib/checkout_op.tcl:358
#, tcl-format
msgid "Staying on branch '%s'."
msgstr "Le répertoire de travail reste sur la branche '%s'."

#: lib/checkout_op.tcl:429
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 ""
"Vous n'êtes plus ur une branche locale.\n"
"\n"
"Si vous vouliez être sur une branche, créez en une maintenant en partant de 'Cet emprunt détaché'."

#: lib/checkout_op.tcl:446
#, tcl-format
msgid "Checked out '%s'."
msgstr "'%s' emprunté."

#: lib/checkout_op.tcl:478
#, tcl-format
msgid "Resetting '%s' to '%s' will lose the following commits:"
msgstr "Réinitialiser '%s' à '%s' va faire perdre les commits suivants :"

#: lib/checkout_op.tcl:500
msgid "Recovering lost commits may not be easy."
msgstr "Récupérer les commits perdus ne sera peut être pas facile."

#: lib/checkout_op.tcl:505
#, tcl-format
msgid "Reset '%s'?"
msgstr "Réinitialiser '%s' ?"

#: lib/checkout_op.tcl:510 lib/merge.tcl:164
msgid "Visualize"
msgstr "Visualiser"

#: lib/checkout_op.tcl:578
#, 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 ""
"Le changement de la branche courante a échoué.\n"
"\n"
"Le répertoire courant n'est que partiellement modifié. Les fichiers ont été mis à jour avec succès, mais la mise à jour d'un fichier interne à Git a échouée.\n"
"\n"
"Cela n'aurait pas du se produire. %s va abandonner et se terminer."

#: lib/choose_font.tcl:39
msgid "Select"
msgstr "Sélectionner"

#: lib/choose_font.tcl:53
msgid "Font Family"
msgstr "Famille de fonte"

#: lib/choose_font.tcl:73
msgid "Font Size"
msgstr "Taille de fonte"

#: lib/choose_font.tcl:90
msgid "Font Example"
msgstr "Exemple de fonte"

#: lib/choose_font.tcl:101
msgid ""
"This is example text.\n"
"If you like this text, it can be your font."
msgstr ""
"C'est un texte d'exemple.\n"
"Si vous aimez ce texte, vous pouvez choisir cette fonte."

#: lib/choose_repository.tcl:27
msgid "Git Gui"
msgstr "Git Gui"

#: lib/choose_repository.tcl:80 lib/choose_repository.tcl:380
msgid "Create New Repository"
msgstr "Créer nouveau référentiel"

#: lib/choose_repository.tcl:86
msgid "New..."
msgstr "Nouveau..."

#: lib/choose_repository.tcl:93 lib/choose_repository.tcl:468
msgid "Clone Existing Repository"
msgstr "Cloner référentiel existant"

#: lib/choose_repository.tcl:99
msgid "Clone..."
msgstr "Cloner..."

#: lib/choose_repository.tcl:106 lib/choose_repository.tcl:978
msgid "Open Existing Repository"
msgstr "Ouvrir référentiel existant"

#: lib/choose_repository.tcl:112
msgid "Open..."
msgstr "Ouvrir..."

#: lib/choose_repository.tcl:125
msgid "Recent Repositories"
msgstr "Référentiels récents"

#: lib/choose_repository.tcl:131
msgid "Open Recent Repository:"
msgstr "Ouvrir référentiel récent :"

#: lib/choose_repository.tcl:294
#, tcl-format
msgid "Location %s already exists."
msgstr "L'emplacement %s existe déjà."

#: lib/choose_repository.tcl:300 lib/choose_repository.tcl:307
#: lib/choose_repository.tcl:314
#, tcl-format
msgid "Failed to create repository %s:"
msgstr "La création du référentiel %s a échouée :"

#: lib/choose_repository.tcl:385 lib/choose_repository.tcl:486
msgid "Directory:"
msgstr "Répertoire :"

#: lib/choose_repository.tcl:415 lib/choose_repository.tcl:544
#: lib/choose_repository.tcl:1013
msgid "Git Repository"
msgstr "Référentiel Git"

#: lib/choose_repository.tcl:430 lib/choose_repository.tcl:437
#, tcl-format
msgid "Directory %s already exists."
msgstr "Le répertoire %s existe déjà."

#: lib/choose_repository.tcl:442
#, tcl-format
msgid "File %s already exists."
msgstr "Le fichier %s existe déjà."

#: lib/choose_repository.tcl:463
msgid "Clone"
msgstr "Cloner"

#: lib/choose_repository.tcl:476
msgid "URL:"
msgstr "URL :"

#: lib/choose_repository.tcl:496
msgid "Clone Type:"
msgstr "Type de clonage :"

#: lib/choose_repository.tcl:502
msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
msgstr "Standard (rapide, semi-redondant, liens durs)"

#: lib/choose_repository.tcl:508
msgid "Full Copy (Slower, Redundant Backup)"
msgstr "Copy complète (plus lent, sauvegarde redondante)"

#: lib/choose_repository.tcl:514
msgid "Shared (Fastest, Not Recommended, No Backup)"
msgstr "Partagé (le plus rapide, non recommandé, pas de sauvegarde)"

#: lib/choose_repository.tcl:550 lib/choose_repository.tcl:597
#: lib/choose_repository.tcl:738 lib/choose_repository.tcl:808
#: lib/choose_repository.tcl:1019 lib/choose_repository.tcl:1027
#, tcl-format
msgid "Not a Git repository: %s"
msgstr "'%s' n'est pas un référentiel Git."

#: lib/choose_repository.tcl:586
msgid "Standard only available for local repository."
msgstr "Standard n'est disponible que pour un référentiel local."

#: lib/choose_repository.tcl:590
msgid "Shared only available for local repository."
msgstr "Partagé n'est disponible que pour un référentiel local."

#: lib/choose_repository.tcl:617
msgid "Failed to configure origin"
msgstr "La configuration de l'origine a échouée."

#: lib/choose_repository.tcl:629
msgid "Counting objects"
msgstr "Comptage des objets"

#: lib/choose_repository.tcl:630
msgid "buckets"
msgstr "paniers"

#: lib/choose_repository.tcl:654
#, tcl-format
msgid "Unable to copy objects/info/alternates: %s"
msgstr "Impossible de copier 'objects/info/alternates' : %s"

#: lib/choose_repository.tcl:690
#, tcl-format
msgid "Nothing to clone from %s."
msgstr "Il n'y a rien à cloner depuis %s."

#: lib/choose_repository.tcl:692 lib/choose_repository.tcl:906
#: lib/choose_repository.tcl:918
msgid "The 'master' branch has not been initialized."
msgstr "Cette branche 'master' n'a pas été initialisée."

#: lib/choose_repository.tcl:705
msgid "Hardlinks are unavailable.  Falling back to copying."
msgstr "Les liens durs ne sont pas disponibles. On se résoud à copier."

#: lib/choose_repository.tcl:717
#, tcl-format
msgid "Cloning from %s"
msgstr "Clonage depuis %s"

#: lib/choose_repository.tcl:748
msgid "Copying objects"
msgstr "Copie des objets"

#: lib/choose_repository.tcl:749
msgid "KiB"
msgstr "KiB"

#: lib/choose_repository.tcl:773
#, tcl-format
msgid "Unable to copy object: %s"
msgstr "Impossible de copier l'objet : %s"

#: lib/choose_repository.tcl:783
msgid "Linking objects"
msgstr "Liaison des objets"

#: lib/choose_repository.tcl:784
msgid "objects"
msgstr "objets"

#: lib/choose_repository.tcl:792
#, tcl-format
msgid "Unable to hardlink object: %s"
msgstr "Impossible créer un lien dur pour l'objet : %s"

#: lib/choose_repository.tcl:847
msgid "Cannot fetch branches and objects.  See console output for details."
msgstr "Impossible de récupérer les branches et objets. Voir la sortie console pour plus de détails."

#: lib/choose_repository.tcl:858
msgid "Cannot fetch tags.  See console output for details."
msgstr "Impossible de récupérer les marques. Voir la sortie console pour plus de détails."

#: lib/choose_repository.tcl:882
msgid "Cannot determine HEAD.  See console output for details."
msgstr "Impossible de déterminer HEAD. Voir la sortie console pour plus de détails."

#: lib/choose_repository.tcl:891
#, tcl-format
msgid "Unable to cleanup %s"
msgstr "Impossible de nettoyer %s"

#: lib/choose_repository.tcl:897
msgid "Clone failed."
msgstr "Le clonage a échoué."

#: lib/choose_repository.tcl:904
msgid "No default branch obtained."
msgstr "Aucune branche par défaut n'a été obtenue."

#: lib/choose_repository.tcl:915
#, tcl-format
msgid "Cannot resolve %s as a commit."
msgstr "Impossible de résoudre %s comme commit."

#: lib/choose_repository.tcl:927
msgid "Creating working directory"
msgstr "Création du répertoire de travail"

#: lib/choose_repository.tcl:928 lib/index.tcl:65 lib/index.tcl:127
#: lib/index.tcl:193
msgid "files"
msgstr "fichiers"

#: lib/choose_repository.tcl:957
msgid "Initial file checkout failed."
msgstr "L'emprunt initial de fichier a échoué."

#: lib/choose_repository.tcl:973
msgid "Open"
msgstr "Ouvrir"

#: lib/choose_repository.tcl:983
msgid "Repository:"
msgstr "Référentiel :"

#: lib/choose_repository.tcl:1033
#, tcl-format
msgid "Failed to open repository %s:"
msgstr "Impossible d'ouvrir le référentiel %s :"

#: lib/choose_rev.tcl:53
msgid "This Detached Checkout"
msgstr "Cet emprunt détaché"

#: lib/choose_rev.tcl:60
msgid "Revision Expression:"
msgstr "Expression de révision :"

#: lib/choose_rev.tcl:74
msgid "Local Branch"
msgstr "Branche locale"

#: lib/choose_rev.tcl:79
msgid "Tracking Branch"
msgstr "Suivi de branche"

#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537
msgid "Tag"
msgstr "Marque"

#: lib/choose_rev.tcl:317
#, tcl-format
msgid "Invalid revision: %s"
msgstr "Révision invalide : %s"

#: lib/choose_rev.tcl:338
msgid "No revision selected."
msgstr "Pas de révision selectionnée."

#: lib/choose_rev.tcl:346
msgid "Revision expression is empty."
msgstr "L'expression de révision est vide."

#: lib/choose_rev.tcl:530
msgid "Updated"
msgstr "Misa à jour"

#: lib/choose_rev.tcl:558
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 ""
"Il n'y a rien à corriger.\n"
"\n"
"Vous allez créer le commit initial. Il n'y a pas de commit avant celui-ci à corriger.\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 ""
"Impossible de corriger pendant une fusion.\n"
"\n"
"Vous êtes actuellement au milieu d'une fusion qui n'a pas été completement terminée. Vous ne pouvez pas corriger le commit précédant sauf si vous abandonnez la fusion courante.\n"

#: lib/commit.tcl:49
msgid "Error loading commit data for amend:"
msgstr "Erreur lors du chargement des données de commit pour correction :"

#: lib/commit.tcl:76
msgid "Unable to obtain your identity:"
msgstr "Impossible d'obtenir votre identité :"

#: lib/commit.tcl:81
msgid "Invalid GIT_COMMITTER_IDENT:"
msgstr "GIT_COMMITTER_IDENT invalide :"

#: lib/commit.tcl:133
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 ""
"L'état lors de la dernière synchronisation ne correspond plus à l'état du référentiel.\n"
"\n"
"Un autre programme Git a modifié ce référentiel depuis la dernière synchronisation. Une resynshronisation doit être effectuée avant de pouvoir créer un nouveau commit.\n"
"\n"
"Cela va être fait tout de suite automatiquement.\n"

#: lib/commit.tcl:154
#, 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 ""
"Des fichiers non fusionnés ne peuvent être commités.\n"
"\n"
"Le fichier %s a des conflicts de fusion. Vous devez les résoudre et pré-commiter le fichier avant de pouvoir commiter.\n"

#: lib/commit.tcl:162
#, tcl-format
msgid ""
"Unknown file state %s detected.\n"
"\n"
"File %s cannot be committed by this program.\n"
msgstr ""
"Un état de fichier inconnu %s a été détecté.\n"
"\n"
"Le fichier %s ne peut pas être commité par ce programme.\n"

#: lib/commit.tcl:170
msgid ""
"No changes to commit.\n"
"\n"
"You must stage at least 1 file before you can commit.\n"
msgstr ""
"Pas de modification à commiter.\n"
"\n"
"Vous devez pré-commiter au moins 1 fichier avant de pouvoir commiter.\n"

#: lib/commit.tcl:183
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 ""
"Merci de fournir un message de commit.\n"
"\n"
"Un bon message de commit a le format suivant :\n"
"\n"
"- Première ligne : décrire en une phrase ce que vous avez fait.\n"
"- Deuxième ligne : rien.\n"
"- Lignes suivantes : Décrire pourquoi ces modifications sont bonnes.\n"

#: lib/commit.tcl:257
msgid "write-tree failed:"
msgstr "write-tree a échoué :"

#: lib/commit.tcl:275
#, tcl-format
msgid "Commit %s appears to be corrupt"
msgstr "Le commit %s semble être corrompu"

#: lib/commit.tcl:279
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 ""
"Pas de modification à commiter.\n"
"\n"
"Aucun fichier n'a été modifié par ce commit et il ne s'agit pas d'un commit de fusion.\n"
"\n"
"Une resynchronisation va être lancée tout de suite automatiquement.\n"

#: lib/commit.tcl:286
msgid "No changes to commit."
msgstr "Pas de modifications à commiter."

#: lib/commit.tcl:303
#, tcl-format
msgid "warning: Tcl does not support encoding '%s'."
msgstr "attention : Tcl ne supporte pas l'encodage '%s'."

#: lib/commit.tcl:317
msgid "commit-tree failed:"
msgstr "commit-tree a échoué :"

#: lib/commit.tcl:339
msgid "update-ref failed:"
msgstr "update-ref a échoué"

#: lib/commit.tcl:430
#, tcl-format
msgid "Created commit %s: %s"
msgstr "Commit créé %s : %s"

#: lib/console.tcl:57
msgid "Working... please wait..."
msgstr "Travail en cours... merci de patienter..."

#: lib/console.tcl:183
msgid "Success"
msgstr "Succès"

#: lib/console.tcl:196
msgid "Error: Command Failed"
msgstr "Erreur : échec de la commande"

#: lib/database.tcl:43
msgid "Number of loose objects"
msgstr "Nombre d'objets en fichier particulier"

#: lib/database.tcl:44
msgid "Disk space used by loose objects"
msgstr "Espace disque utilisé par les fichiers particuliers"

#: lib/database.tcl:45
msgid "Number of packed objects"
msgstr "Nombre d'objets empaquetés"

#: lib/database.tcl:46
msgid "Number of packs"
msgstr "Nombre de paquets d'objets"

#: lib/database.tcl:47
msgid "Disk space used by packed objects"
msgstr "Espace disque utilisé par les objets empaquetés"

#: lib/database.tcl:48
msgid "Packed objects waiting for pruning"
msgstr "Objets empaquetés attendant d'être supprimés"

#: lib/database.tcl:49
msgid "Garbage files"
msgstr "Fichiers poubelle"

#: lib/database.tcl:72ets
msgid "Compressing the object database"
msgstr "Compression de la base des objets"

#: lib/database.tcl:83
msgid "Verifying the object database with fsck-objects"
msgstr "Vérification de la base des objets avec 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 ""
"Ce référentiel comprend actuellement environ %i objets ayant leur fichier particulier.\n"
"\n"
"Pour conserver une performance optimale, il est fortement recommandé de comprimer la base quand plus de %i objets ayant leur fichier particulier existent.\n"
"\n"
"Comprimer la base maintenant ?"

#: lib/date.tcl:25
#, tcl-format
msgid "Invalid date from Git: %s"
msgstr "Date invalide de Git : %s"

#: lib/diff.tcl:42
#, 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 ""
"Aucune différence détectée.\n"
"\n"
"%s ne comporte aucune modification.\n"
"\n"
"La date de modification de ce fichier a été mise à jour par une autre application, mais le contenu du fichier n'a pas changé.\n"
"\n"
"Une resynchronisation va être lancée automatiquement pour trouver d'autres fichiers qui pourraient se trouver dans le même état."

#: lib/diff.tcl:81
#, tcl-format
msgid "Loading diff of %s..."
msgstr "Chargement des différences de %s..."

#: lib/diff.tcl:114 lib/diff.tcl:184
#, tcl-format
msgid "Unable to display %s"
msgstr "Impossible d'afficher %s"

#: lib/diff.tcl:115
msgid "Error loading file:"
msgstr "Erreur lors du chargement du fichier :"

#: lib/diff.tcl:122
msgid "Git Repository (subproject)"
msgstr "Référentiel Git (sous projet)"

#: lib/diff.tcl:134
msgid "* Binary file (not showing content)."
msgstr "* Fichier binaire (pas d'apperçu du contenu)."

#: lib/diff.tcl:185
msgid "Error loading diff:"
msgstr "Erreur lors du chargement des différences :"

#: lib/diff.tcl:302
msgid "Failed to unstage selected hunk."
msgstr "La suppression dans le pré-commit de la section sélectionnée a échouée."

#: lib/diff.tcl:309
msgid "Failed to stage selected hunk."
msgstr "Le pré-commit de la section sélectionnée a échoué."

#: lib/error.tcl:12 lib/error.tcl:102
msgid "error"
msgstr "erreur"

#: lib/error.tcl:28
msgid "warning"
msgstr "attention"

#: lib/error.tcl:81
msgid "You must correct the above errors before committing."
msgstr "Vous devez corriger les erreurs suivantes avant de pouvoir commiter."

#: lib/index.tcl:6
msgid "Unable to unlock the index."
msgstr "Impossible de dévérouiller le pré-commit."

#: lib/index.tcl:15
msgid "Index Error"
msgstr "Erreur de pré-commit"

#: lib/index.tcl:21
msgid ""
"Updating the Git index failed.  A rescan will be automatically started to "
"resynchronize git-gui."
msgstr "Le pré-commit a échoué. Une resynchronisation va être lancée automatiquement."

#: lib/index.tcl:27
msgid "Continue"
msgstr "Continuer"

#: lib/index.tcl:31
msgid "Unlock Index"
msgstr "Dévérouiller le pré-commit"

#: lib/index.tcl:282
#, tcl-format
msgid "Unstaging %s from commit"
msgstr "Supprimer %s du commit"

#: lib/index.tcl:326
#, tcl-format
msgid "Adding %s"
msgstr "Ajouter %s"

#: lib/index.tcl:381
#, tcl-format
msgid "Revert changes in file %s?"
msgstr "Inverser les modifications dans le fichier %s ? "

#: lib/index.tcl:383
#, tcl-format
msgid "Revert changes in these %i files?"
msgstr "Inverser les modifications dans ces %i fichiers ?"

#: lib/index.tcl:389
msgid "Any unstaged changes will be permanently lost by the revert."
msgstr "Toutes les modifications non pré-commitées seront définitivement perdues lors de l'inversion."

#: lib/index.tcl:392
msgid "Do Nothing"
msgstr "Ne rien faire"

#: 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 ""
"Impossible de fucionner pendant une correction.\n"
"\n"
"Vous devez finir de corriger ce commit avant de lancer une quelconque fusion.\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 ""
"L'état lors de la dernière synchronisation ne correspond plus à l'état du référentiel.\n"
"\n"
"Un autre programme Git a modifié ce référentiel depuis la dernière synchronisation. Une resynchronisation doit être effectuée avant de pouvoir fusionner de nouveau.\n"
"\n"
"Cela va être fait tout de suite automatiquement\n"

#: lib/merge.tcl:44
#, 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 ""
"Vous êtes au milieu d'une fusion conflictuelle.\n"
"\n"
"Le fichier %s a des conflicts de fusion.\n"
"\n"
"Vous devez les résoudre, puis pré-commiter le fichier, et enfin commiter pour terminer la fusion courante. Seulementà ce moment là, il sera possible d'effectuer une nouvelle fusion.\n"

#: lib/merge.tcl:54
#, 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 ""
"Vous êtes au milieu d'une modification.\n"
"\n"
"Le fichier %s est modifié.\n"
"\n"
"Vous devriez terminer le commit courant avant de lancer une fusion. En faisait comme cela, vous éviterez de devoir éventuellement abandonner une fusion ayant échouée.\n"

#: lib/merge.tcl:106
#, tcl-format
msgid "%s of %s"
msgstr "%s de %s"

#: lib/merge.tcl:119
#, tcl-format
msgid "Merging %s and %s"
msgstr "Fusion de %s et %s"

#: lib/merge.tcl:131
msgid "Merge completed successfully."
msgstr "La fusion s'est faite avec succès."

#: lib/merge.tcl:133
msgid "Merge failed.  Conflict resolution is required."
msgstr "La fusion a echouée. Il est nécessaire de résoudre les conflicts."

#: lib/merge.tcl:158
#, tcl-format
msgid "Merge Into %s"
msgstr "Fusion dans %s"

#: lib/merge.tcl:177
msgid "Revision To Merge"
msgstr "Révision à fusionner"

#: lib/merge.tcl:212
msgid ""
"Cannot abort while amending.\n"
"\n"
"You must finish amending this commit.\n"
msgstr ""
"Impossible d'abandonner en cours de correction.\n"
"\n"
"Vous devez finir de corriger ce commit.\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 ""
"Abandonner la fusion ?\n"
"\n"
"Abandonner la fusion courante entrainera la perte de TOUTES les modifications non commitées.\n"
"\n"
"Abandonner quand même la fusion courante ?"

#: 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 ""
"Réinitialiser les modifications ?\n"
"\n"
"Réinitialiser les modifications va faire perdre TOUTES les modifications non commitées.\n"
"\n"
"Réinitialiser quand même les modifications courantes ?"

#: lib/merge.tcl:239
msgid "Aborting"
msgstr "Abandon"

#: lib/merge.tcl:266
msgid "Abort failed."
msgstr "L'abandon a échoué."

#: lib/merge.tcl:268
msgid "Abort completed.  Ready."
msgstr "Abandon teminé. Prêt."

#: lib/option.tcl:82
msgid "Restore Defaults"
msgstr "Remettre les valeurs par défaut"

#: lib/option.tcl:86
msgid "Save"
msgstr "Sauvegarder"

#: lib/option.tcl:96
#, tcl-format
msgid "%s Repository"
msgstr "Référentiel de %s"

#: lib/option.tcl:97
msgid "Global (All Repositories)"
msgstr "Globales (tous les référentiels)"

#: lib/option.tcl:103
msgid "User Name"
msgstr "Nom d'utilisateur"

#: lib/option.tcl:104
msgid "Email Address"
msgstr "Adresse email"

#: lib/option.tcl:106
msgid "Summarize Merge Commits"
msgstr "Résumer les commits de fusion"

#: lib/option.tcl:107
msgid "Merge Verbosity"
msgstr "Fusion bavarde"

#: lib/option.tcl:108
msgid "Show Diffstat After Merge"
msgstr "Montrer statistiques de diff après fusion"

#: lib/option.tcl:110
msgid "Trust File Modification Timestamps"
msgstr "Faire confiance aux dates de modification de fichiers "

#: lib/option.tcl:111
msgid "Prune Tracking Branches During Fetch"
msgstr "Nettoyer les branches de suivi pendant la récupération"

#: lib/option.tcl:112
msgid "Match Tracking Branches"
msgstr "Faire correspondre les branches de suivi"

#: lib/option.tcl:113
msgid "Number of Diff Context Lines"
msgstr "Nombre de lignes de contexte dans les diffs"

#: lib/option.tcl:114
msgid "New Branch Name Template"
msgstr "Nouveau modèle de nom de branche"

#: lib/option.tcl:176
msgid "Change Font"
msgstr "Modifier les fontes"

#: lib/option.tcl:180
#, tcl-format
msgid "Choose %s"
msgstr "Choisir %s"

#: lib/option.tcl:186
msgid "pt."
msgstr "pt."

#: lib/option.tcl:200
msgid "Preferences"
msgstr "Préférences"

#: lib/option.tcl:235
msgid "Failed to completely save options:"
msgstr "La sauvegarde complète des options a échouée :"

#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
msgid "Delete Remote Branch"
msgstr "Supprimer branche distante"

#: lib/remote_branch_delete.tcl:47
msgid "From Repository"
msgstr "Référentiel"

#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123
msgid "Remote:"
msgstr "Branche distante :"

#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138
msgid "Arbitrary URL:"
msgstr "URL arbitraire :"

#: lib/remote_branch_delete.tcl:84
msgid "Branches"
msgstr "Branches"

#: lib/remote_branch_delete.tcl:109
msgid "Delete Only If"
msgstr "Supprimer seulement si"

#: lib/remote_branch_delete.tcl:111
msgid "Merged Into:"
msgstr "Fusionné dans :"

#: lib/remote_branch_delete.tcl:119
msgid "Always (Do not perform merge checks)"
msgstr "Toujours (ne pas vérifier les fusions)"

#: lib/remote_branch_delete.tcl:152
msgid "A branch is required for 'Merged Into'."
msgstr "Une branche est nécessaire pour 'Fusionné dans'."

#: lib/remote_branch_delete.tcl:184
#, tcl-format
msgid ""
"The following branches are not completely merged into %s:\n"
"\n"
" - %s"
msgstr ""
"Les branches suivantes ne sont pas complètement fusionnées dans %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 "Une ou plusieurs des tests de fusion ont échoués parce que vous n'avez pas récupéré les commits nécessaires. Essayez de récupéré à partir de %s d'abord."

#: lib/remote_branch_delete.tcl:207
msgid "Please select one or more branches to delete."
msgstr "Merci de sélectionner une ou plusieurs branches à supprimer."

#: lib/remote_branch_delete.tcl:216
msgid ""
"Recovering deleted branches is difficult.\n"
"\n"
"Delete the selected branches?"
msgstr ""
"Récupérer des branches supprimées est difficile.\n"
"\n"
"Souhaitez vous supprimer les branches sélectionnées ?"

#: lib/remote_branch_delete.tcl:226
#, tcl-format
msgid "Deleting branches from %s"
msgstr "Supprimer les branches de %s"

#: lib/remote_branch_delete.tcl:286
msgid "No repository selected."
msgstr "Aucun référentiel n'est sélectionné."

#: lib/remote_branch_delete.tcl:291
#, tcl-format
msgid "Scanning %s..."
msgstr "Synchronisation de %s..."

#: lib/remote.tcl:165
msgid "Prune from"
msgstr "Nettoyer de"

#: lib/remote.tcl:170
msgid "Fetch from"
msgstr "Récupérer de"

#: lib/remote.tcl:213
msgid "Push to"
msgstr "Pousser vers"

#: lib/shortcut.tcl:20 lib/shortcut.tcl:61
msgid "Cannot write shortcut:"
msgstr "Impossible d'écrire le raccourcis :"

#: lib/shortcut.tcl:136
msgid "Cannot write icon:"
msgstr "Impossible d'écrire l'icône :"

#: lib/status_bar.tcl:83
#, tcl-format
msgid "%s ... %*i of %*i %s (%3i%%)"
msgstr "%s ... %*i de %*i %s (%3i%%)"

#: lib/transport.tcl:6
#, tcl-format
msgid "fetch %s"
msgstr "récupérer %s"

#: lib/transport.tcl:7
#, tcl-format
msgid "Fetching new changes from %s"
msgstr "Récupération des dernières modifications de %s"

#: lib/transport.tcl:18
#, tcl-format
msgid "remote prune %s"
msgstr "nettoyer à distance %s"

#: lib/transport.tcl:19
#, tcl-format
msgid "Pruning tracking branches deleted from %s"
msgstr "Nettoyer les branches de suivi supprimées de %s"

#: lib/transport.tcl:25 lib/transport.tcl:71
#, tcl-format
msgid "push %s"
msgstr "pousser %s"

#: lib/transport.tcl:26
#, tcl-format
msgid "Pushing changes to %s"
msgstr "Les modifications sont poussées vers %s"

#: lib/transport.tcl:72
#, tcl-format
msgid "Pushing %s %s to %s"
msgstr "Pousse %s %s vers %s"

#: lib/transport.tcl:89
msgid "Push Branches"
msgstr "Pousser branches"

#: lib/transport.tcl:103
msgid "Source Branches"
msgstr "Branches source"

#: lib/transport.tcl:120
msgid "Destination Repository"
msgstr "Référentiel de destination"

#: lib/transport.tcl:158
msgid "Transfer Options"
msgstr "Transférer options"

#: lib/transport.tcl:160
msgid "Force overwrite existing branch (may discard changes)"
msgstr "Forcer l'écrasement d'une branche existante (peut supprimer des modifications)"

#: lib/transport.tcl:164
msgid "Use thin pack (for slow network connections)"
msgstr "Utiliser des petits paquets (pour les connexions lentes)"

#: lib/transport.tcl:168
msgid "Include tags"
msgstr "Inclure les marques"


^ permalink raw reply

* Re: [PATCH] git-remote - Unset core.origin when deleting the default remote
From: Mark Levedahl @ 2008-01-15  5:02 UTC (permalink / raw)
  To: Jeff King; +Cc: gitster, git
In-Reply-To: <20080114110512.GA12723@coredump.intra.peff.net>

Jeff King wrote:
> On Sun, Jan 13, 2008 at 11:27:08AM -0500, Mark Levedahl wrote:
>
>   
>> --- a/git-remote.perl
>> +++ b/git-remote.perl
>> @@ -328,6 +328,11 @@ sub rm_remote {
>>  
>>  	$git->command('config', '--remove-section', "remote.$name");
>>  
>> +	my $defremote = $git->config("core.origin");
>> +	if (defined $defremote && $defremote eq $name) {
>> +	       $git->command("config", "--unset", "core.origin");
>> +	}
>> +
>>     
>
> I'm not sure I see the use case that this helps.
>   
Just being thorough: the man page claims that "git remote rm foo" 
removes all mention of remote foo.

>     Alternatively, when adding a remote, if it is the _only_ remote (or
>     perhaps if the current core.origin doesn't exist), we could set
>     core.origin which would automagically cover the latter two cases.
>     Although it feels a little too DWIM.
>
> -Peff
>   
I suspect anything done in this case is going to suffer from DWIM-itis 
in some conditions. I can't offer a better argument than the one above.

Mark

^ permalink raw reply

* Re: [PATCH] Teach remote machinery about remotes.default config variable
From: Mark Levedahl @ 2008-01-15  4:55 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Johannes Schindelin, git
In-Reply-To: <7vabn9m30a.fsf@gitster.siamese.dyndns.org>

Junio C Hamano wrote:
> Mark Levedahl <mlevedahl@gmail.com> writes:
>
>   
>> ... if what
>> we need to fetch from is in fact not origin (even though the master
>> project knows what server to access), submodule update in fact doesn't
>> even work ...
>>     
>
> This is an interesting point.
>
> Perhaps git-submodule.sh::modules_update should use $url it
> obtains from the configuration in the upper level when running
> git-fetch in the submodule.
>   
yes, I like this change, it works very nicely. but that last patch is 
only a partial solution...
> If you view the problem this way, your earlier "git fetch while
> the HEAD is detached always uses 'origin'" may turn out to be a
> non-issue.
>
> Which again brings us back to Johannes's earlier point.  If the
> issue is about submodule, maybe what needs to be fixes is in
> git-submodule, and not the defaulting to 'origin' git-fetch and
> friends do.
>   
Nope, git submodule *still* requires origin (e.g., execute git submodule 
init or update on a detached head). We are dancing around the issue, not 
fixing the root cause. This is perhaps illuminated by splitting projects 
into two camps:

Camp1 - there is no need to distinguish the upstream servers (or there 
is only one), calling it/all origin is fine.
Camp2 - there is a need to distinguish servers, they are not identical, 
uniform naming across project is required (but folks might still like to 
be able to have a default, and probably want to change that default on 
occasion), .

So far, git is written as if the whole world is in Camp1, and the 
problems appear for Camp2. The underlying issue is that git has 
convolved the referencing, naming, and designation of a default remote 
into *one* thing when it is really three things. For git, the default 
remote is named origin, which is also how it is designated as the 
default, and is also how you reference the default in commands. 
Non-default remotes have an arbitrary nickname, are not default as they 
are not called origin, and are referenced by using their nicknames.

To serve Camp2 (and not impact Camp1), origin should be a handle that 
dereferences to the name of the default remote, and designation of the 
default remote should be by a separate config item rather than a special 
name for the remote. Assume core.origin names the default remote:

For Campl, we have
    core.origin=origin
with the default remote having nickname origin.

For Camp2, we could have
    core.origin=<whatever>
with the default remote having nickname <whatever>

At the command line, "git fetch" dereferences to $(git config 
core.origin), which is origin for Camp1, but <whatever> for Camp2. So, 
Camp1 users don't notice anything is different, and Camp2 users don't 
have a number of different servers all referred to as "origin".

The key is that in Camp2, a given remote now can have  the *same* 
nickname for all members of the project, regardless of which remote they 
have made their default. "git fetch" and "git fetch origin" still work, 
they just dereference core.origin (perhaps verbosely to warn that the 
remote being updated is *not* actually named origin), then update the 
remotes/$(git config core.origin)/* branches.

Obviously, Camp1 with core.origin=origin is the default, and everything 
in user land works exactly as it does today. Camp2 with 
core.origin~=default is only mentioned in the graduate level git course 
and shielded with "Caution, Sharp Knives!" signs. Fine, I need the knives.

Mark

^ permalink raw reply

* [PATCH] Squelch bogus progress output from git-rebase--interactive
From: Junio C Hamano @ 2008-01-15  4:04 UTC (permalink / raw)
  To: git

The command repeats "Rebasing (1/1)" many times even when
there is only one task remaining, because mark_action_done() is
called to skip comment and empty lines in the TODO file.

This should fix it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git-rebase--interactive.sh |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index acdcc54..402ff37 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -73,14 +73,19 @@ comment_for_reflog () {
 	esac
 }
 
+last_count=
 mark_action_done () {
 	sed -e 1q < "$TODO" >> "$DONE"
 	sed -e 1d < "$TODO" >> "$TODO".new
 	mv -f "$TODO".new "$TODO"
 	count=$(($(grep -ve '^$' -e '^#' < "$DONE" | wc -l)))
 	total=$(($count+$(grep -ve '^$' -e '^#' < "$TODO" | wc -l)))
-	printf "Rebasing (%d/%d)\r" $count $total
-	test -z "$VERBOSE" || echo
+	if test "$last_count" != "$count"
+	then
+		last_count=$count
+		printf "Rebasing (%d/%d)\r" $count $total
+		test -z "$VERBOSE" || echo
+	fi
 }
 
 make_patch () {
-- 
1.5.4.rc3.10.g471a

^ permalink raw reply related

* Re: git-commit fatal: Out of memory? mmap failed: Bad file descriptor
From: Brandon Casey @ 2008-01-15  2:42 UTC (permalink / raw)
  To: Git Mailing List; +Cc: drafnel
In-Reply-To: <4787E981.7010200@nrlssc.navy.mil>

Brandon Casey wrote:
> I got this message from git-commit:
> 
> $ git commit -a
> <edit message, :wq>
> fatal: Out of memory? mmap failed: Bad file descriptor
> Create commit <my_prompt_string>

I ran git-bisect and the result is below. Doesn't look like
much help though.

To reiterate, I only have problems with the builtin-commit,
i.e. 1.5.4.*, the 1.5.3.* series works correctly. Of course
if this is a memory corruption issue, then it could just be
that the pattern of memory accesses in 1.5.3 does not tweak
the problem.

The other possibly useful info is that running
'git commit -a -C HEAD --amend' does not cause the error.



1596456309315befb3fd0a985d50a70ed09493e4 is first bad commit
commit 1596456309315befb3fd0a985d50a70ed09493e4
Author: Junio C Hamano <gitster@pobox.com>
Date:   Sun Dec 16 15:03:58 2007 -0800

    builtin-commit: fix summary output.

    Because print_summary() forgot to call diff_setup_done() after futzing with
    diff output options, it failed to activate recursive diff, which resulted in
    an incorrect summary.

    Signed-off-by: Junio C Hamano <gitster@pobox.com>

:100644 100644 518ebe0347e631c72f4e2a83b948259ee20fd213 61770ef456ca7f5f8342796e66f7ebfd3e1e7f73 M      builtin-commit.c


I've spent a number of hours trying to debug this. If there are any other ideas for
debugging, let me know. I'll keep the repo for a while.

-brandon

^ permalink raw reply

* Re: performance problem: "git commit filename"
From: Junio C Hamano @ 2008-01-15  1:13 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Git Mailing List, Kristian H?gsberg
In-Reply-To: <alpine.LFD.1.00.0801141611560.2806@woody.linux-foundation.org>

Linus Torvalds <torvalds@linux-foundation.org> writes:

> On Sun, 13 Jan 2008, Junio C Hamano wrote:
>> 
>> I've reworked the patch, and in the kernel repository, a
>> single-path commit after touching that path now calls 23k
>> lstat(2).  It used to call 46k lstat(2) after your fix.
>
> Hmm. This part of it looks incorrect:
>
>> diff --git a/diff.c b/diff.c
>> index b18c140..62d0c06 100644
>> --- a/diff.c
>> +++ b/diff.c
>> @@ -1510,6 +1510,10 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
>>  	if (pos < 0)
>>  		return 0;
>>  	ce = active_cache[pos];
>> +
>> +	if (ce_uptodate(ce))
>> +		return 1;
>> +
>>  	if ((lstat(name, &st) < 0) ||
>>  	    !S_ISREG(st.st_mode) || /* careful! */
>>  	    ce_match_stat(ce, &st, 0) ||
>
> Isn't this wrong?

You are right.  We call this with sha1 that may not necessarily
be the same as ce->sha1.

The code should probably be something like:

	ce = active_cache[pos];

	/*
         * Even if ce matches the work tree, it is not what we can
	 * reuse for sha1, if the hash is different or not a
         * regular blob.
         */
	if (hashcmp(sha1, ce->sha1) || !S_ISREG(ntohl(ce->st_mode))
		return 0;
	/*
         * Does ce actually match the work tree?  If so we can reuse.
         */
	if (ce_uptodate(ce) ||
	    (!lstat(name, &st) && !ce_match_stat(ce, &st, 0)))
		return 1;
	return 0;

The expression inside the latter if () condition should probably
be the new abstraction at the level of ce_modified().

Currently ce_modified() assumes that lstat(2) is cheap and the
callers have called it on paths they are interested in already.

^ permalink raw reply

* [PATCH] hg-to-git: improve popen calls
From: Mark Drago @ 2008-01-15  1:11 UTC (permalink / raw)
  To: gitster; +Cc: git, brian.ewins, stelian

This patch improves all of the popen calls in hg-to-git.py by specifying the
template 'hg log' should use instead of calling 'hg log' and grepping for the
desired data.

Signed-off-by: Mark Drago <markdrago@gmail.com>

---

Hello,

I wrote this patch back when the popen calls within hg-to-git came up on the
list and I'm just now getting around to sending it in.  Junio commented on one
of the popen calls by saying the following:

"Isn't this one of the ugliest lines in the whole git.git project, I have
to wonder?" -- Junio, http://marc.info/?l=git&m=119673122106601&w=2

So, this patch removes that line and improves the rest of the popen calls
as well.  It also reduces the overall number of popen calls by combining a
bunch of them.

diff --git a/contrib/hg-to-git/hg-to-git.py b/contrib/hg-to-git/hg-to-git.py
index 9befb92..c35b158 100755
--- a/contrib/hg-to-git/hg-to-git.py
+++ b/contrib/hg-to-git/hg-to-git.py
@@ -1,6 +1,6 @@
 #! /usr/bin/python
 
-""" hg-to-svn.py - A Mercurial to GIT converter
+""" hg-to-git.py - A Mercurial to GIT converter
 
     Copyright (C)2007 Stelian Pop <stelian@popies.net>
 
@@ -27,6 +27,8 @@ import re
 hgvers = {}
 # List of children for each hg revision
 hgchildren = {}
+# List of parents for each hg revision
+hgparents = {}
 # Current branch for each hg revision
 hgbranch = {}
 # Number of new changesets converted from hg
@@ -99,17 +101,19 @@ if state:
     else:
         print 'State does not exist, first run'
 
-tip = os.popen('hg tip | head -1 | cut -f 2 -d :').read().strip()
+tip = os.popen('hg tip --template "{rev}"').read()
 print 'tip is', tip
 
 # Calculate the branches
 print 'analysing the branches...'
 hgchildren["0"] = ()
+hgparents["0"] = (None, None)
 hgbranch["0"] = "master"
 for cset in range(1, int(tip) + 1):
     hgchildren[str(cset)] = ()
-    prnts = os.popen('hg log -r %d | grep ^parent: | cut -f 2 -d :' % cset).readlines()
-    if len(prnts) > 0:
+    prnts = os.popen('hg log -r %d --template "{parents}"' % cset).read().split(' ')
+    prnts = map(lambda x: x[:x.find(':')], prnts)
+    if prnts[0] != '':
         parent = prnts[0].strip()
     else:
         parent = str(cset - 1)
@@ -120,6 +124,8 @@ for cset in range(1, int(tip) + 1):
     else:
         mparent = None
 
+    hgparents[str(cset)] = (parent, mparent)
+
     if mparent:
         # For merge changesets, take either one, preferably the 'master' branch
         if hgbranch[mparent] == 'master':
@@ -147,34 +153,27 @@ for cset in range(int(tip) + 1):
     hgnewcsets += 1
 
     # get info
-    prnts = os.popen('hg log -r %d | grep ^parent: | cut -f 2 -d :' % cset).readlines()
-    if len(prnts) > 0:
-        parent = prnts[0].strip()
-    else:
-        parent = str(cset - 1)
-    if len(prnts) > 1:
-        mparent = prnts[1].strip()
-    else:
-        mparent = None
-
+    log_data = os.popen('hg log -r %d --template "{tags}\n{date|date}\n{author}\n"' % cset).readlines()
+    tag = log_data[0].strip()
+    date = log_data[1].strip()
+    user = log_data[2].strip()
+    parent = hgparents[str(cset)][0]
+    mparent = hgparents[str(cset)][1]
+
+    #get comment
     (fdcomment, filecomment) = tempfile.mkstemp()
-    csetcomment = os.popen('hg log -r %d -v | grep -v ^changeset: | grep -v ^parent: | grep -v ^user: | grep -v ^date | grep -v ^files: | grep -v ^description: | grep -v ^tag:' % cset).read().strip()
+    csetcomment = os.popen('hg log -r %d --template "{desc}"' % cset).read().strip()
     os.write(fdcomment, csetcomment)
     os.close(fdcomment)
 
-    date = os.popen('hg log -r %d | grep ^date: | cut -f 2- -d :' % cset).read().strip()
-
-    tag = os.popen('hg log -r %d | grep ^tag: | cut -f 2- -d :' % cset).read().strip()
-
-    user = os.popen('hg log -r %d | grep ^user: | cut -f 2- -d :' % cset).read().strip()
-
     print '-----------------------------------------'
     print 'cset:', cset
     print 'branch:', hgbranch[str(cset)]
     print 'user:', user
     print 'date:', date
     print 'comment:', csetcomment
-    print 'parent:', parent
+    if parent:
+	print 'parent:', parent
     if mparent:
         print 'mparent:', mparent
     if tag:
@@ -224,8 +223,7 @@ for cset in range(int(tip) + 1):
         os.system('git-branch -d %s' % otherbranch)
 
     # retrieve and record the version
-    vvv = os.popen('git-show | head -1').read()
-    vvv = vvv[vvv.index(' ') + 1 : ].strip()
+    vvv = os.popen('git-show --quiet --pretty=format:%H').read()
     print 'record', cset, '->', vvv
     hgvers[str(cset)] = vvv
 

^ permalink raw reply related

* [PATCH] Add [HOWTO] using merge subtree.
From: Miklos Vajna @ 2008-01-15  0:35 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Sean, git
In-Reply-To: <7vabnefx3d.fsf@gitster.siamese.dyndns.org>

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
---

Here comes the 3rd try. I wonder if I should remove the mail header :) The
commands are from the mail, but the patch itself now are more based on the
suggestions by Junio (and reworded / reorganized).

Sorry for the late reply, I had some problem with my mail setup.

 Documentation/Makefile                    |    2 +-
 Documentation/howto/use-merge-subtree.txt |   71 +++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+), 1 deletions(-)
 create mode 100644 Documentation/howto/use-merge-subtree.txt

diff --git a/Documentation/Makefile b/Documentation/Makefile
index 7b0685b..4addb8a 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -23,7 +23,7 @@ ARTICLES += everyday
 ARTICLES += git-tools
 ARTICLES += glossary
 # with their own formatting rules.
-SP_ARTICLES = howto/revert-branch-rebase user-manual
+SP_ARTICLES = howto/revert-branch-rebase howto/use-merge-subtree user-manual
 API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt)))
 SP_ARTICLES += $(API_DOCS)
 SP_ARTICLES += technical/api-index
diff --git a/Documentation/howto/use-merge-subtree.txt b/Documentation/howto/use-merge-subtree.txt
new file mode 100644
index 0000000..2f4f38a
--- /dev/null
+++ b/Documentation/howto/use-merge-subtree.txt
@@ -0,0 +1,71 @@
+Date: Sat, 5 Jan 2008 20:17:40 -0500
+From: Sean <seanlkml@sympatico.ca>
+To: Miklos Vajna <vmiklos@frugalware.org>
+Cc: git@vger.kernel.org
+Subject: Re: how to use git merge -s subtree?
+Abstract: In this article, Sean demonstrates how one can use the subtree merge
+ strategy.
+Message-ID: <BAYC1-PASMTP12374B54BA370A1E1C6E78AE4E0@CEZ.ICE>
+
+How to use the subtree merge strategy
+=====================================
+
+There are situations where you want to include contents in your project from an
+independently developed project. You can just pull from the other project as
+long as there are no conflicting paths.
+
+The problematic case is when there are conflicting files. Potential candidates
+are Makefiles and other standard filenames. You could merge these files but
+probably you do not want.  A better solution for this problem can be to merge
+the project to its own subdirectory. This is not supported by the 'recursive'
+merge strategy, so just pulling won't work.
+
+What you want is the 'subtree' merge strategy, which helps you in such a
+situation.
+
+In this example, let's say you have the repository at `/path/to/B` (but it can
+be an URL as well, if you want). You want to merge the 'master' branch of that
+repository to the `dir-B` subdirectory in your current branch.
+
+Here are all the commands you need:
+
+----------------
+$ git remote add -f Bproject /path/to/B <1>
+$ git merge -s ours --no-commit Bproject/master <2>
+$ git read-tree --prefix=dir-B/ -u Bproject/master <3>
+$ git commit -m "Merge B project as our subdirectory" <4>
+
+$ git pull -s subtree Bproject master <5>
+----------------
+<1> name the other project "Bproject", and fetch.
+<2> prepare for the later step to record the result as a merge.
+<3> read "master" branch of Bproject to the subdirectory "dir-B".
+<4> record the merge result.
+<5> maintain the result with subsequent merges using "subtree"
+
+The first four commands are necessary for the initial merge, while the last one
+should be used to merge updates from 'B project'.
+
+Comparing 'subtree' merge with submodules
+-----------------------------------------
+
+- The benefit of using subtree merge is that it requires less attention from
+  the users of your repository. It works with older (before Git v1.5.2) clients
+  and you have the code right after clone.
+
+- However if you use submodules then you can choose not to transfer the
+  submodule objects. This may be a problem with the subtree merge.
+
+- Also, in case you make changes to the other project, it is easier to submit
+  changes if you just use submodules.
+
+Additional tips
+---------------
+
+- If you made changes to the other project in your repository, they may want to
+  merge from your project. This is possible using subtree -- it can shift up
+  the paths in your tree and then they can merge only the relevant parts of
+  your tree.
+
+- Please note that if the other project merges from you, then it will connects
+  its history to yours, which can be something they don't want to.
-- 
1.5.4.rc2-dirty

^ permalink raw reply related

* Re: performance problem: "git commit filename"
From: Linus Torvalds @ 2008-01-15  0:18 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Git Mailing List, Kristian H?gsberg
In-Reply-To: <7vr6glnrvp.fsf@gitster.siamese.dyndns.org>



On Sun, 13 Jan 2008, Junio C Hamano wrote:
> 
> I've reworked the patch, and in the kernel repository, a
> single-path commit after touching that path now calls 23k
> lstat(2).  It used to call 46k lstat(2) after your fix.

Hmm. This part of it looks incorrect:

> diff --git a/diff.c b/diff.c
> index b18c140..62d0c06 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -1510,6 +1510,10 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
>  	if (pos < 0)
>  		return 0;
>  	ce = active_cache[pos];
> +
> +	if (ce_uptodate(ce))
> +		return 1;
> +
>  	if ((lstat(name, &st) < 0) ||
>  	    !S_ISREG(st.st_mode) || /* careful! */
>  	    ce_match_stat(ce, &st, 0) ||

Isn't this wrong? I think it also needs to check that ce->sha1 matches the 
right SHA1, because even if the lstat() information may be fine, if the 
SHA1 doesn't match what we want, we still shouldn't use the checked-out 
copy, of course.

The old code continues with a

	   hashcmp(sha1, ce->sha1))
		return 0;

in that if-statement that is partially visible in the context, and it's 
that hashcmp() that got incorrectly cut off from the logic.

(Of course, maybe we never call this function unless we've already checked 
that the cache-entry SHA1 matches, but if so, that subsequent hashcmp 
should just be removed instead).

		Linus

^ permalink raw reply

* Re: [PATCH] safecrlf: Add flag to convert_to_git() to disable safecrlf check
From: Junio C Hamano @ 2008-01-14 23:58 UTC (permalink / raw)
  To: Steffen Prohaska; +Cc: dpotapov, gitster, torvalds, git
In-Reply-To: <12003528401309-git-send-email-prohaska@zib.de>

Steffen Prohaska <prohaska@zib.de> writes:

> We want to verify if an autocrlf conversion is reversible only if
> the converted data is actually written to the repository.  Only
> in this case the file would be modified during the next checkout.
> But convert_to_git() is used for some other purposes.
> This commit adds a flag to convert_to_git() that controls if the
> safecrlf check is enabled...

At first this felt dirty to me as convert_to_git() is not
limited to crlf, but about external vs canonical representation.
The variable name being "checksafe" however makes it much more
palatable.  It is clear that it is talking about irreversible
conversion.

When running diff with a work tree file and the index (or a
named tree), we read the work tree file and run convert_to_git()
on it before comparing it with what we have in the object store
(either index or a named tree).  When running apply without
touching the index, we also use convert_to_git() on the work
tree file.  The patch file is supposed to record the data in
canonical format, I think.

Of course, "git add" on the path will warn or fail with your
patch, but we may somehow want to be warned about the breakage
before "git add" on that path triggers it.  Perhaps we can have
a separate "check-work-tree" command that iterates over locally
modified work tree files and runs convert_to_git() with checking
enabled.

^ permalink raw reply

* Re: performance problem: "git commit filename"
From: Linus Torvalds @ 2008-01-14 23:53 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Kristian Høgsberg, Git Mailing List
In-Reply-To: <7vodbohstl.fsf@gitster.siamese.dyndns.org>



On Mon, 14 Jan 2008, Junio C Hamano wrote:
> 
> Yeah, the breakage was not about the correctness, and because I
> almost never do partial commit I did not notice it until Linus
> brought it up.

I wouldn't have noticed it either, if it wasn't for the fact that my 
kernel tree was out-of-cache for other testing reasons. When cached, the 
difference was still quite noticeable, but I would probably not have 
noticed the difference between half a second and a second and a half.

But a commit that took over a minute due to IO was very noticeable 
indeed..

		Linus

^ permalink raw reply

* Re: performance problem: "git commit filename"
From: Junio C Hamano @ 2008-01-14 23:48 UTC (permalink / raw)
  To: Kristian Høgsberg; +Cc: Linus Torvalds, Git Mailing List
In-Reply-To: <1200352558.488.10.camel@gaara.boston.redhat.com>

Kristian Høgsberg <krh@redhat.com> writes:

> ...  I guess it fell through the cracks,
> especially since it never caused the test suite to fail :/

Yeah, the breakage was not about the correctness, and because I
almost never do partial commit I did not notice it until Linus
brought it up.

^ permalink raw reply

* Re: performance problem: "git commit filename"
From: Kristian Høgsberg @ 2008-01-14 23:46 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, Git Mailing List
In-Reply-To: <alpine.LFD.1.00.0801121949180.2806@woody.linux-foundation.org>

On Sat, 2008-01-12 at 20:04 -0800, Linus Torvalds wrote:

> It makes builtin-commit.c use the same logic that "git read-tree -i -m" 
> does (which is what the old shell script did), and it seems to pass the 
> test-suite, and it looks pretty obvious.
> 
> It also brings down the number of open/mmap/munmap/close calls to where it 
> should be, although it still does *way* too many "lstat()" operations (ie 
> it does 4*lstat for each file in the index - one more than the 
> non-filename one does).
> 
> With that fixed, performance is also roughly where it should be (ie the 
> 17-18s for the cold-cache case), because it no longer needs to rehash all 
> the files!
> 
> HOWEVER. This was just a quick hack, and while it all looks sane, this is 
> some damn core code. Somebody else should double- and triple-check this.

I took a look too, and it looks to me like the it's the exact same code
path in builtin-read-tree.c that the old

        git read-tree --index-output="$TMP_INDEX" -i -m HEAD

part of the shell script would trigger.  So yes, this look like the
right fix to me.

Signed-off-by: Kristian Høgsberg <krh@redhat.com>

^ permalink raw reply

* Print Precedes/Follows in git log
From: Jan Engelhardt @ 2008-01-14 23:34 UTC (permalink / raw)
  To: git

Hi,


gitk has a nice feature in that, when a commit is selected, it prints in 
the log window something like:

(id 1beeffe43311f64df8dd0ab08ff6b1858c58363f)

Author: Tony Jones <tonyj@suse.de>  2007-08-20 22:46:20
Committer: Mark M. Hoffman <mhoffman@lightlink.com>  2007-10-10 04:56:30
Parent: 8afb10490b18e916e33707baa7d1cfc615d545ea (hwmon: (f71882fg) trivial whitespace cleanup)
Branches: ...
Follows: v2.6.23
Precedes: v2.6.24-rc1

And it would be really nice if `git log` would also show the 
Precedes/Follows lines so one can identify much more easily in
big logs like those of the Linux kernel what the next release to
have a given patch is.


thanks,
Jan

^ permalink raw reply

* Re: git-commit fatal: Out of memory? mmap failed: Bad file descriptor
From: Brandon Casey @ 2008-01-14 23:22 UTC (permalink / raw)
  To: Alex Riesen; +Cc: Git Mailing List, drafnel
In-Reply-To: <20080112201622.GA2992@steel.home>

On Sat, 12 Jan 2008, Alex Riesen wrote:

> Brandon Casey, Fri, Jan 11, 2008 23:47:17 +0100:
>>
>> It's reproduceable for me by amending the commit.
>>
>> Any suggestions?
>
> strace -o log -f git commit -C HEAD --amend
>
> and post the "log" here (assuming it failed)

It does not fail when -C HEAD is used.

Specifically I did...

   Modify Makefile.in (random file).
   git commit -a --amend
   <:wq when vi opens, i.e. save without making changes>
   <failure>

   Modify Makefile.in
   git commit -a -C HEAD --amend
   <successful completion>

   Modify Makefile.in
   git commit -a --amend
   <:wq save without making change>
   <failure>

-brandon

^ permalink raw reply

* [PATCH] safecrlf: Add flag to convert_to_git() to disable safecrlf check
From: Steffen Prohaska @ 2008-01-14 23:20 UTC (permalink / raw)
  To: dpotapov; +Cc: gitster, torvalds, git, Steffen Prohaska
In-Reply-To: <004D2FB5-2CEA-4DB1-AF8D-D5ADEB0F0508@zib.de>

This commit goes on top of
"[PATCH v3] safecrlf: Add mechanism to warn about irreversible crlf conversions"
I send it as a separate patch to make reviewing easier.
Eventually it should be squashed.

I looked briefly at the various places where convert_to_git() is
called.  I think that only the one code path through index_fd()
actually writes data to the repsitory.  Maybe someone else with
a better understanding of git's internals should confirm this.

    Steffen

---- snip ---

We want to verify if an autocrlf conversion is reversible only if
the converted data is actually written to the repository.  Only
in this case the file would be modified during the next checkout.
But convert_to_git() is used for some other purposes.

This commit adds a flag to convert_to_git() that controls if the
safecrlf check is enabled.  The check is only enabled if
index_fd() writes the object converted.  In all other cases the
check is disabled.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 builtin-apply.c |    2 +-
 builtin-blame.c |    2 +-
 cache.h         |    2 +-
 convert.c       |   10 +++++-----
 diff.c          |    2 +-
 sha1_file.c     |    2 +-
 6 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/builtin-apply.c b/builtin-apply.c
index d57bb6e..9fb6fe3 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1430,7 +1430,7 @@ static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)
 	case S_IFREG:
 		if (strbuf_read_file(buf, path, st->st_size) != st->st_size)
 			return error("unable to open or read %s", path);
-		convert_to_git(path, buf->buf, buf->len, buf);
+		convert_to_git(path, buf->buf, buf->len, buf, 0);
 		return 0;
 	default:
 		return -1;
diff --git a/builtin-blame.c b/builtin-blame.c
index 9b4c02e..c361ee1 100644
--- a/builtin-blame.c
+++ b/builtin-blame.c
@@ -2073,7 +2073,7 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con
 		if (strbuf_read(&buf, 0, 0) < 0)
 			die("read error %s from stdin", strerror(errno));
 	}
-	convert_to_git(path, buf.buf, buf.len, &buf);
+	convert_to_git(path, buf.buf, buf.len, &buf, 0);
 	origin->file.ptr = buf.buf;
 	origin->file.size = buf.len;
 	pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_sha1);
diff --git a/cache.h b/cache.h
index 4e03e3d..43e7d0e 100644
--- a/cache.h
+++ b/cache.h
@@ -640,7 +640,7 @@ extern void trace_argv_printf(const char **argv, const char *format, ...);
 
 /* convert.c */
 /* returns 1 if *dst was used */
-extern int convert_to_git(const char *path, const char *src, size_t len, struct strbuf *dst);
+extern int convert_to_git(const char *path, const char *src, size_t len, struct strbuf *dst, int checksafe);
 extern int convert_to_working_tree(const char *path, const char *src, size_t len, struct strbuf *dst);
 
 /* add */
diff --git a/convert.c b/convert.c
index c9678ee..5adef4f 100644
--- a/convert.c
+++ b/convert.c
@@ -81,7 +81,7 @@ static int is_binary(unsigned long size, struct text_stat *stats)
 }
 
 static int crlf_to_git(const char *path, const char *src, size_t len,
-                       struct strbuf *buf, int action)
+                       struct strbuf *buf, int action, int checksafe)
 {
 	struct text_stat stats;
 	char *dst;
@@ -107,7 +107,7 @@ static int crlf_to_git(const char *path, const char *src, size_t len,
 			return 0;
 	}
 
-	if (safe_crlf && auto_crlf > 0 && action != CRLF_INPUT) {
+	if (safe_crlf && checksafe && auto_crlf > 0 && action != CRLF_INPUT) {
 		/* CRLFs would be added by checkout: check if we have "naked" LFs */
 		if (stats.lf != stats.crlf) {
 			if (safe_crlf == SAFE_CRLF_WARN)
@@ -144,7 +144,7 @@ static int crlf_to_git(const char *path, const char *src, size_t len,
 		} while (--len);
 	}
 
-	if (safe_crlf && (action == CRLF_INPUT || auto_crlf <= 0)) {
+	if (safe_crlf && checksafe && (action == CRLF_INPUT || auto_crlf <= 0)) {
 		/* CRLFs would not be restored by checkout: check if we removed CRLFs */
 		if (buf->len != dst - buf->buf) {
 			if (safe_crlf == SAFE_CRLF_WARN)
@@ -553,7 +553,7 @@ static int git_path_check_ident(const char *path, struct git_attr_check *check)
 	return !!ATTR_TRUE(value);
 }
 
-int convert_to_git(const char *path, const char *src, size_t len, struct strbuf *dst)
+int convert_to_git(const char *path, const char *src, size_t len, struct strbuf *dst, int checksafe)
 {
 	struct git_attr_check check[3];
 	int crlf = CRLF_GUESS;
@@ -575,7 +575,7 @@ int convert_to_git(const char *path, const char *src, size_t len, struct strbuf
 		src = dst->buf;
 		len = dst->len;
 	}
-	ret |= crlf_to_git(path, src, len, dst, crlf);
+	ret |= crlf_to_git(path, src, len, dst, crlf, checksafe);
 	if (ret) {
 		src = dst->buf;
 		len = dst->len;
diff --git a/diff.c b/diff.c
index b18c140..b5ac4f9 100644
--- a/diff.c
+++ b/diff.c
@@ -1624,7 +1624,7 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
 		 * Convert from working tree format to canonical git format
 		 */
 		strbuf_init(&buf, 0);
-		if (convert_to_git(s->path, s->data, s->size, &buf)) {
+		if (convert_to_git(s->path, s->data, s->size, &buf, 0)) {
 			size_t size = 0;
 			munmap(s->data, s->size);
 			s->should_munmap = 0;
diff --git a/sha1_file.c b/sha1_file.c
index 6583797..3b5413d 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -2342,7 +2342,7 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
 	if ((type == OBJ_BLOB) && S_ISREG(st->st_mode)) {
 		struct strbuf nbuf;
 		strbuf_init(&nbuf, 0);
-		if (convert_to_git(path, buf, size, &nbuf)) {
+		if (convert_to_git(path, buf, size, &nbuf, write_object)) {
 			munmap(buf, size);
 			buf = strbuf_detach(&nbuf, &size);
 			re_allocated = 1;
-- 
1.5.4.rc2.60.g46ee

^ permalink raw reply related

* Re: performance problem: "git commit filename"
From: Kristian Høgsberg @ 2008-01-14 23:15 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, Git Mailing List
In-Reply-To: <alpine.LFD.1.00.0801121735020.2806@woody.linux-foundation.org>

On Sat, 2008-01-12 at 17:46 -0800, Linus Torvalds wrote:

> HOWEVER. When that logic was converted from that shell-script into a 
> builtin-commit.c, that conversion was not done correctly. The old "git 
> read-tree -i -m" was not translated as a "unpack_trees()" call, but as 
> this in prepare_index():
> 
> 	discard_cache()
> 	..
> 	tree = parse_tree_indirect(head_sha1);
> 	..
> 	read_tree(tree, 0, NULL)
> 
> which is very wrong, because it replaces the old index entirely, and 
> doesn't do that stat information merging.
> 
> As a result, the index that is created by read-tree is totally bogus in 
> the stat cache, and yes, everything will have to be re-computed.
> 
> Kristian?

Sorry for being late to the game, and yes, it's a bug I introduced with
the rewrite.  When doing the rewrite I was a bit puzzled by the

  git-read-tree --index-output="$TMP_INDEX" -i -m HEAD

part of the shell script.  I carried a FIXME around in the patch for a
while, as can be seen here:

  http://marc.info/?l=git&m=118478660425992&w=2

since I couldn't figure out what the difference in behavior was between
just using read_tree(), which did exactly what I wanted and the more
complicated unpack_tree().  I guess it fell through the cracks,
especially since it never caused the test suite to fail :/

Kristian

^ permalink raw reply

* Re: Git Cygwin - unable to create any repository - help!
From: Paul Umbers @ 2008-01-14 22:21 UTC (permalink / raw)
  To: Alex Riesen; +Cc: git
In-Reply-To: <20080114202932.GA25130@steel.home>

The "mount" command tells me everything I have is mounted in binmode.
I have used Git on a default cygwin install (win XP pro) before and
not had this problem - that's why this is so frustrating. Not sure
what changed this time round as I tend to use defaults for most
installations.

Are you saying I need to make sure the repository directory is mounted
in text-mode (for Windows compatibility)? I just reinstalled cygwin,
selecting text-mode as the default. I can create a git repository, but
"git add ." returns:

fatal: cannot use /cygdrive/c/test/.git/info/exclude as an exclude file

Paul

 On Jan 14, 2008 1:29 PM, Alex Riesen <raa.lkml@gmail.com> wrote:
> Paul Umbers, Mon, Jan 14, 2008 18:21:44 +0100:
>
> > Trying to create a repository under the cygwin install of git, windows
> > XP Pro. I can create the initial repository OK using "git init" and
> > add files using "git add .", but when I come to commit I get the
> > messages:
> >
> > error: invalid object d9b06fceac52f6c24357e6a7f85c601
> > 088381152
> > fatal: git-write-tree: error building trees
>
> Is it a "text-mode" mount where your repository is to reside?
>
>



-- 
Computer Science is no more about computers than astronomy is about telescopes.
--- Edsger W. Dijkstra

Paul Umbers MSc MBCS MIAP
paul.umbers@gmail.com

^ permalink raw reply

* Re: [PATCH] builtin-commit.c: remove useless check added by faulty cut and paste
From: Junio C Hamano @ 2008-01-14 21:54 UTC (permalink / raw)
  To: しらいしななこ; +Cc: git
In-Reply-To: <200801142128.m0ELSBoE030025@mi0.bluebottle.com>

しらいしななこ  <nanako3@bluebottle.com> writes:

> You are calling overlay_tree_on_cache() which does use CE_UPDATE flag to mark
> duplicate entries.  And that is the same algorithm as used when git-ls-files
> is called with its --with-tree option.  I think this if statement is not
> mindless but is the right thing to have the same logic as you have in
> git-ls-files.

You are right and I was stupid.

Because the pathname ce->name is given to path_list_insert()
which does not allow duplicates, there is no breakage either way
from the correctness point of view in this codepath, unlike the
one in ls-files.  But avoiding unnecessary processing with a
single bit check is certainly better.

Will revert, but I first have to go find a brown paper bag.

^ permalink raw reply

* Re: [PATCH] Make default pre-commit hook less noisy
From: Junio C Hamano @ 2008-01-14 21:51 UTC (permalink / raw)
  To: Jean-Luc Herren; +Cc: git
In-Reply-To: <478BD87E.7030606@gmx.ch>

Jean-Luc Herren <jlh@gmx.ch> writes:

> This hook thought to have found a conflict marker any time it saw
> a 7-character combination of any of the characters '<>=' at the
> beginning of a line, whereas it should only look for the *same*
> character to appear repeatedly.

I think itt looks good.  Thanks.

^ permalink raw reply

* [PATCH] Make default pre-commit hook less noisy
From: Jean-Luc Herren @ 2008-01-14 21:47 UTC (permalink / raw)
  To: git

This hook thought to have found a conflict marker any time it saw
a 7-character combination of any of the characters '<>=' at the
beginning of a line, whereas it should only look for the *same*
character to appear repeatedly.

Also, restrict it to match exactly 7 times, to avoid matching the
underlining with '='-characters often used in documentation.

Signed-off-by: Jean-Luc Herren <jlh@gmx.ch>
---
As far as I know, this will still properly match all conflict
markers, even those by cvs or svn.

 templates/hooks--pre-commit |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/templates/hooks--pre-commit b/templates/hooks--pre-commit
index 7092bae..b25dce6 100644
--- a/templates/hooks--pre-commit
+++ b/templates/hooks--pre-commit
@@ -61,7 +61,7 @@ perl -e '
 	    if (/^\s* \t/) {
 		bad_line("indent SP followed by a TAB", $_);
 	    }
-	    if (/^(?:[<>=]){7}/) {
+	    if (/^([<>])\1{6} |^={7}$/) {
 		bad_line("unresolved merge conflict", $_);
 	    }
 	}
-- 
1.5.3.8

^ permalink raw reply related

* Re: [PATCH 1/2] parse_commit_buffer: don't parse invalid commits
From: Junio C Hamano @ 2008-01-14 21:42 UTC (permalink / raw)
  To: Martin Koegler; +Cc: git
In-Reply-To: <20080114205826.GB5058@auto.tuwien.ac.at>

mkoegler@auto.tuwien.ac.at (Martin Koegler) writes:

> You seem to have missed my reply to your last mail:
> http://marc.info/?l=git&m=119969163624138&w=2

Yeah, apparently I did.

> On the other hand, it is possible, that somebody pushed such a commit
> out, if he does not notice it. Then its difficult to get rid of the
> broken commit. [Hasn't happend a broken commit on pu recently?]

That's true, but I wonder if there is a reasonable middle
ground.  For example, we could keep the warning you added (by
calling error() to identify which commit object is suspicious)
without making the whole function return that error.  Then a
broken commit could have been catched while reviewing the series
before the commit gets pushed out.

>> I do not think the checks done by fsck and parse_commit should
>> share the same strictness.  They serve different purposes.
>
> Maybe I can improve fsck.

Thanks.  It should notice bogus commits but it should allow
checking objects referenced by them unless the particular
bogosity is severe enough to make "tree " and "parent " lines in
them invalid.

IOW, the information on the "author" line is not that important.
It has zero importance from the structural viewpoint, just like
the commit log message contents does not have any structural
importance (it does not even affect how the log output is sorted
at all, while the timestamp on the "committer" line has some say
in it).

Noticing a bogus "author" or "committer" line is like noticing
that your commit log message has garbage characters in it.
Maybe a future option to fsck might want to check that all log
messages are encoded in UTF-8, and you may catch some that are
in ISO-8859-1.  After flagging them as such, the program should
still continue digging the history down to check its ancestors,
as such a breakage does not affect the structural integrity of
the history.

^ permalink raw reply

* Re: [PATCH] builtin-commit.c: remove useless check added by faulty cut and paste
From: しらいしななこ @ 2008-01-14 21:23 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <7v8x2uqabt.fsf_-_@gitster.siamese.dyndns.org>

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

> When I did 2888605c649ccd423232161186d72c0e6c458a48
> (builtin-commit: fix partial-commit support), I mindlessly cut
> and pasted from builtin-ls-files.c, and included the part that
> was meant to exclude redundant path after "ls-files --with-tree"
> overlayed the HEAD commit on top of the index.  This logic does
> not apply to what git-commit does and should not have been
> copied, even though it would not hurt.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  builtin-commit.c |    2 --
>  1 files changed, 0 insertions(+), 2 deletions(-)
>
> diff --git a/builtin-commit.c b/builtin-commit.c
> index 6d2ca80..265ba6b 100644
> --- a/builtin-commit.c
> +++ b/builtin-commit.c
> @@ -156,8 +156,6 @@ static int list_paths(struct path_list *list, const char *with_tree,
>  
>  	for (i = 0; i < active_nr; i++) {
>  		struct cache_entry *ce = active_cache[i];
> -		if (ce->ce_flags & htons(CE_UPDATE))
> -			continue;
>  		if (!pathspec_match(pattern, m, ce->name, 0))
>  			continue;
>  		path_list_insert(ce->name, list);

I think I may be wrong, but is this change really correct?

You are calling overlay_tree_on_cache() which does use CE_UPDATE flag to mark
duplicate entries.  And that is the same algorithm as used when git-ls-files
is called with its --with-tree option.  I think this if statement is not
mindless but is the right thing to have the same logic as you have in
git-ls-files.

-- 
Nanako Shiraishi
http://ivory.ap.teacup.com/nanako3/

----------------------------------------------------------------------
Finally - A spam blocker that actually works.
http://www.bluebottle.com/tag/4

^ permalink raw reply

* [PATCH] parse_commit_buffer: don't parse invalid commits
From: Martin Koegler @ 2008-01-14 21:20 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Martin Koegler

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
---
 commit.c |   27 ++++++++++++++++++++-------
 1 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/commit.c b/commit.c
index f074811..8b8fb04 100644
--- a/commit.c
+++ b/commit.c
@@ -48,19 +48,32 @@ struct commit *lookup_commit(const unsigned char *sha1)
 	return check_commit(obj, sha1, 0);
 }
 
-static unsigned long parse_commit_date(const char *buf)
+static unsigned long parse_commit_date(const char *buf, const char *tail)
 {
 	unsigned long date;
+	const char *dateptr;
 
+	if (buf + 6 >= tail)
+		return 0;
 	if (memcmp(buf, "author", 6))
 		return 0;
-	while (*buf++ != '\n')
+	while (buf < tail && *buf++ != '\n')
 		/* nada */;
+	if (buf + 9 >= tail)
+		return 0;
 	if (memcmp(buf, "committer", 9))
 		return 0;
-	while (*buf++ != '>')
+	while (buf < tail && *buf++ != '>')
 		/* nada */;
-	date = strtoul(buf, NULL, 10);
+	if (buf >= tail)
+		return 0;
+	dateptr = buf;
+	while (buf < tail && *buf++ != '\n')
+		/* nada */;
+	if (buf >= tail)
+		return 0;
+	/* dateptr < buf && buf[-1] == '\n', so strtoul will stop at buf-1 */
+	date = strtoul(dateptr, NULL, 10);
 	if (date == ULONG_MAX)
 		date = 0;
 	return date;
@@ -236,9 +249,9 @@ int parse_commit_buffer(struct commit *item, void *buffer, unsigned long size)
 		return 0;
 	item->object.parsed = 1;
 	tail += size;
-	if (tail <= bufptr + 5 || memcmp(bufptr, "tree ", 5))
+	if (tail <= bufptr + 46 || memcmp(bufptr, "tree ", 5) || bufptr[45] != '\n')
 		return error("bogus commit object %s", sha1_to_hex(item->object.sha1));
-	if (tail <= bufptr + 45 || get_sha1_hex(bufptr + 5, parent) < 0)
+	if (get_sha1_hex(bufptr + 5, parent) < 0)
 		return error("bad tree pointer in commit %s",
 			     sha1_to_hex(item->object.sha1));
 	item->tree = lookup_tree(parent);
@@ -275,7 +288,7 @@ int parse_commit_buffer(struct commit *item, void *buffer, unsigned long size)
 			n_refs++;
 		}
 	}
-	item->date = parse_commit_date(bufptr);
+	item->date = parse_commit_date(bufptr, tail);
 
 	if (track_object_refs) {
 		unsigned i = 0;
-- 
gitgui.0.9.1.g61374

^ permalink raw reply related

* Re: performance problem: "git commit filename"
From: Linus Torvalds @ 2008-01-14 21:00 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Git Mailing List, Kristian H?gsberg
In-Reply-To: <7vodbojhkj.fsf@gitster.siamese.dyndns.org>



On Mon, 14 Jan 2008, Junio C Hamano wrote:
> 
> If we are using different types anyway, we might want to start
> using time_t (a worse alternative is ulong which we use for
> timestamps everywhere else, which we probably want to convert to
> time_t as well).

Careful.

There are two issues, one trivial one and one important one:
 (a) trivially, right now, the code depends on the fact that the in-memory 
     structure is actually smaller than the on-disk one, to avoid having 
     to estimate the size of the allocation for the in-memory array. That 
     was a matter of gettign a quickly working and efficient patch (we do 
     *not* want to allocate those initial "struct cache_entry" entries one 
     by one, we want to allocate one big block!)

     This should be pretty easy to fix up, by just taking the sizes and 
     number of entries (which we do know) into account of the initial 
     allocation. However, it's made a bit more interesting by the 
     differing alignment of the "name" part (and the fact that we align 
     each individual on-disk and in-memory structure).

 (b) More importantly, the on-disk structures DO NOT CONTAIN the whole 
     stat information! The classic example of this is "ce_size": it's 
     32-bit, but it works even if you have a file that is larger than 32 
     bits in size! It just means that from a stat comparison standpoint, 
     we only compare the low 32 bits!

     This means that if you make "ce_size" be a "loff_t", for example, you 
     still need to then *compare* it in just an "unsigned int",  because 
     the upper bits aren't zero - they are "nonexistent".

that (b) is important, and is why some of the code changed from

	-       if (ce->ce_ino != htonl(st->st_ino))
	+       if (ce->ce_ino != (unsigned int) st->st_ino)

ie note how this didn't just remove the "htonl()", it replaced it by a 
"truncate to 'unsigned int'"!

So the fact that the types aren't necessarily the "native" types is 
actually *important*.

> Is there still a reason to insist that ce_flags should be a
> single field that is multi-purposed for storing stage, namelen
> and other flags?  Wouldn't the code become even simpler and
> safer if we separated them into individual fields?  For example,
> a piece like this:

No reason for that part, except I wanted to make this particular initial 
patch be as minimal as possible.

> I somehow had this impression that it was a huge deal to you
> that we do not have to read and populate each cache entry when
> reading from the existing index file, and thought that was the
> reason why we mmap and access the fields in network byte order.
> If that was my misconception, then I agree this is a good change
> to make everything else easier to write and much less error
> prone.

I was a bit worried about it, but I did make sure that the allocation is 
done as one single allocation, and I did time it. Doing a 

	git update-index --refresh

seems to be identical before and after, so the costs of conversion are 
either very small or are possibly counteracted by the fact that we then 
can avoid the byte-order conversion of individual words less at run-time.

		Linus

^ 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