# Git/Problèmes connus

* Principes
* Apprendre à travailler avec Git
** Avant de commencer : installation et configuration de Git
** Création de votre dépôt local
** Visualiser le contenu de votre dépôt local
** Premiers pas
** Gestion des branches
** Synchroniser le dépôt local avec le dépôt distant
* Fonctionnalités avancées
** Étiquetage (tags)
** Remise (stash)
** Recombinaison (rebase)
** Sous-modules et Super-projets
** Structure interne
** Pull-request
* Recettes
** Exclure des fichiers du dépôt
** Écrire des messages de commit
* Environnement
** Intégration dans les IDEs
** Améliorer sa productivité en configurant Git
** Git sous Linux
** Git sous Windows
** Forges
*** GitLab
*** GitHub
*** Bitbucket
* Git et Subversion (svn)
** Passer de Subversion à Git
** Travailler avec Git local et un dépôt Subversion distant
** Participer au développement de Wikimédia (Gerrit)
* Problèmes connus
* Ressources externes
* Principes
* Apprendre à travailler avec Git
** Avant de commencer : installation et configuration de Git
** Création de votre dépôt local
** Visualiser le contenu de votre dépôt local
** Premiers pas
** Gestion des branches
** Synchroniser le dépôt local avec le dépôt distant
* Fonctionnalités avancées
** Étiquetage (tags)
** Remise (stash)
** Recombinaison (rebase)
** Sous-modules et Super-projets
** Structure interne
** Pull-request
* Recettes
** Exclure des fichiers du dépôt
** Écrire des messages de commit
* Environnement
** Intégration dans les IDEs
** Améliorer sa productivité en configurant Git
** Git sous Linux
** Git sous Windows
** Forges
*** GitLab
*** GitHub
*** Bitbucket
* Git et Subversion (svn)
** Passer de Subversion à Git
** Travailler avec Git local et un dépôt Subversion distant
** Participer au développement de Wikimédia (Gerrit)
* Problèmes connus
* Ressources externes
[ Modifier le sommaire ]

## Impossible de cloner un dépôt

Plusieurs erreurs possibles :
* fatal: Authentication failed for... : l'identifiant de la forge n'est pas le bon.
* Host key verification failed : la clé SSH du dépôt à cloner ne correspond pas à la locale. Par exemple si le clonage a lieu dans un Docker, ce dernier doit avoir accès une clé connue du dépôt (au moyen d'un volume partagé avec l'hôte).
* fatal: Could not read from remote repository / Impossible de lire le dépôt distant : si le git clone est refusé en SSH, essayer en HTTPS. Sinon, créer une clé d'authentification sur le dépôt.
* fatal: repository 'http://MonServeur/MonDepotEnLigne.git' not found / remote: The project you were looking for could not be found or you don't have permission to view it : si le dossier existe et est accessible en HTTP, mais que le clone, pull ou push ne le trouve pas :
** Vérifier que l'utilisateur a les droits d'écriture (pour Windows avec IIS, c'est II_IUSRS).
** Si le dépôt est sur le LAN, éviter HTTP : git clone file:////MonServeur/c$/inetpub/wwwroot/MonDepotEnLigne.git.
** Dans le cas d'un clone d'un dépôt privé, vous devez faire partie des invités.
** Si c'est en SSH, se loguer avant. Ex : ssh -T git@gitlab.com.
*** Si cette commande renvoie "error in libcrypto", c'est peut-être que le rsa n'est pas supporté. Auquel cas il faut regénérer une clé par exemple en ed25519.
** Si c'est en HTTP, tester en ajoutant en nom d'utilisateur dans l'URL. Ex : https://mon_login_gitlab@gitlab.com/mon_login_gitlab/mon_repo.git.
** Dans le cas d'un clone de GitHub, ce site n'accepte plus les mots de passe depuis 2022, mais demande à la place un token généré sur https://github.com/settings/tokens.
** Si vous avez deux comptes Git sur la même forge (ex : pro et perso), les ajouter tous les deux dans ~/.ssh/config.

## Un fichier du .gitignore apparait malgré tout dans ceux à commiter

C'est certainement que le fichier avait été commité avant d'être ajouté au .gitignore. Il faut donc le supprimer dans un commit (sans qu'il soit dans .gitignore sinon sa suppression sera ignorée) puis regarder à nouveau s'il apparait. Si c'est le cas le faire disparaitre avec git rm --cached nom_du_fichier.

## Un fichier ou un dossier n'est pas commité avec les bonnes majuscules

Problème propre à Windows :
Ne pas changer cette configuration avant de faire un rebase sur une branche créée sans elle, sous peine de ne pas pouvoir rebaser sur les commits de configuration différente.

## cannot checkout in the current repository state

Il y a des fichiers créés qui doivent être supprimés ou archivés avant de pouvoir créer une nouvelle branche :

## error: droits insuffisant pour ajouter un objet à la base de données .git/objects du dépôt

Recloner pour que le dépôt fonctionne.

## error: bad index file sha1 signature, fatal: index file corrupt

Recloner pour que le dépôt fonctionne (le dépôt a certainement été copié manuellement au lieu d'être cloné).

## error: ... Permission denied

Un problème de permissions est survenu. Si elles sont bien définies pour le compte utilisé, et que le projet utilise Docker, relancer les conteneurs.

### error: could not open '.git/rebased-patches' for reading: Permission denied

Erreur lors d'un rebase. Cela peut survenir avec Docker Desktop, dans ce cas :
* Lancer rebase -i débloque la situation.
* Sinon, lancer le rebase dans un conteneur où le volume du dépôt est partagé.
* Sinon, recréer la branche à partir de celle de base, soit par cherry-pick, soit "stash -u" sur le contenu de la branche à rebaser, la supprimer, puis "stash pop" sur une nouvelle branche du même nom.
* Sinon, remplacer le rebase par un merge.

### error: opening .git/config: Permission denied

Lors du clonage, au pire on peut télécharger le dépôt.

### error: permission denied (publickey)

Utiliser HTTPS au lieu de SSH.
Ou initialiser SSH. Ex : ssh -vT git@github.com.

## error: could not restore untracked files from stash

Se produit lors d'un git stash pop ou git stash apply vers des fichiers en conflit. Pour que le stash les remplace :

## error: failed to push some refs to ...

Il y a plusieurs solutions :
* git reset HEAD~1 && git pull && git add -A && git commit -m "Mon commit" && git push.
* git pull && git push : plus simple à faire mais ajoute un merge local pouvant polluer l'historique de la branche.
* git pull --rebase && git push : plus propre mais avec risque de conflits.

## error: impossible de restaurer les fichiers non-suivis depuis le remisage

Forcer l'application du stash avec :

## error: le commit cc636d99b0ac37ba8a5c14a70ce69cb223055deb est une fusion mais l'option -m n'a pas été spécifiée.

Pour annuler un merge, il faut rajouter "-m 1" :

## error: pathspec 'MaBranche1' did not match any file(s) known to git

Il faut récupérer les nouvelles branches du serveur avec :

## error: src refspec master does not match any

Il faut faire un git add * avec au moins un changement.

## error: The branch 'ma-branche' is not a strict subset of your current HEAD.

Voir Git/Branches.

## error: Your local changes to the following files would be overwritten by merge

Pour sauvegarder le travail local :
Pour supprimer le travail local :
On peut mélanger les deux si on supprime d'abord quelques fichiers avant de sauvegarder le reste :

## failed to create a new commit

Reconfigurer :

## failed to create a pull request

Faire un "git push" avant, pour que le serveur connaisse la branche.

## failed to push some refs to 'MonDepot1.git' hint: Updates were rejected because the tip of your current branch is behind

voire

## failed to sync this branch because due to unmerged files

Le dépôt distant possède certains fichiers qui sont plus à jour que le local, et vice-versa.
Si le message provient d'une interface graphique, essayer de la fermer et de lancer la synchro en shell, avec git push. Cela peut donner un message plus précis, ex :
Dans ce cas, on peut modifier le fichier "config" du serveur distant en ajoutant "bare=true".
Sinon, il faut créer une nouvelle branche pour faire un "pull request".
Sinon, copier les fichiers locaux dans un autre dossier (parent), et recloner avant de les replacer.

## fatal: index-pack failed

git pull n'a pas été lancé depuis le répertoire du dépôt.

## fatal: remote origin already exists

Pour redéfinir origin il faut le supprimer d'abord :

## fatal: This operation must be run in a work tree

Lors d'un git add sur un dépôt initialisé avec -- bare, il faut soit uniquement lui soumettre ses modifications (sans possibilité de le cloner, avec git remote add origin), soit définir un répertoire de branche avec --work-tree.

## fatal: unable to access 'https://MonServeur/MonDepotEnLigne.git/': SSL certificate problem: self signed certificate

Lors du clonage, remplacer HTTPS par HTTP, ou bien désactiver la vérification du certificat SSL :

## File mode changed from 100644 to 100755

Si certains fichiers apparaissent dans les diff car leurs métadonnées ont été modifiées (et pas leur contenu), c'est qu'une application a changé leurs inodes. Pour éviter cela :

## Please, commit your changes or stash them before you can merge

Précéder le pull d'un stash :

## This file is empty

Si un fichier apparait comme modifié, mais que son diff affiche ce message, c'est que seules ses métadonnées ont changé (ex : date de mise à jour).

## You must edit all merge conflicts and then mark them as resolved using git add

Survient lors d'un :
non précédé d'un :
Bien sûr les fichiers en conflit doivent faire partie de cet ajout.

## you need to resolve your current index first

Cela sert aussi à annuler un merge demandé par "git stash pop".

## Your branch is behind 'xxx' by y commits, and can be fast-forwarded

Dans ce cas il peut être préférable d'effacer la veille branche du serveur pour ne garder que la locale, qui sera synchronisée sur le serveur ensuite.

## Références

* ↑ Ex : https://github.com/mon_repo/settings/access
* ↑ https://medium.com/uncaught-exception/setting-up-multiple-gitlab-accounts-82b70e88c437
* ↑ https://git-scm.com/book/fr/v1/Git-sur-le-serveur-Mise-en-place-du-serveur