647 votes

Faire du commit actuel le seul (initial) commit dans un dépôt Git ?

J'ai actuellement un dépôt Git local, que je pousse vers un dépôt Github.

Le dépôt local a ~10 commits, et le dépôt Github est un duplicata synchronisé de celui-ci.

Ce que j'aimerais faire, c'est supprimer TOUT l'historique des versions du dépôt Git local, afin que le contenu actuel du dépôt apparaisse comme le seul commit (et donc que les anciennes versions des fichiers du dépôt ne soient pas stockées).

J'aimerais ensuite pousser ces changements sur Github.

J'ai étudié Git rebase, mais cela semble être plus adapté à la suppression de versions spécifiques. Une autre solution potentielle est de supprimer le repo local et d'en créer un nouveau - mais cela créerait probablement beaucoup de travail !

ETA : Il y a des répertoires / fichiers spécifiques qui ne sont pas suivis - si possible, j'aimerais maintenir le non suivi de ces fichiers.

965voto

larsmans Points 167484

Voici l'approche par la force brute. Elle supprime également la configuration du référentiel.

Note : Cela ne fonctionne PAS si le dépôt a des submodules ! Si vous utilisez des submodules, vous devez utiliser par exemple rebasement interactif

Étape 1 : supprimer tout l'historique ( Assurez-vous d'avoir une sauvegarde, vous ne pouvez pas revenir en arrière. )

cat .git/config  # note <github-uri>
rm -rf .git

Étape 2 : reconstruire le repo Git avec seulement le contenu actuel

git init
git add .
git commit -m "Initial commit"

Étape 3 : pousser vers GitHub.

git remote add origin <github-uri>
git push -u --force origin main

597voto

Zeelot Points 834

La seule solution qui fonctionne pour moi (et qui permet aux submodules de continuer à fonctionner) est la suivante

git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

Suppression de .git/ cause toujours d'énormes problèmes lorsque j'ai des sous-modules. Utilisation de git rebase --root causerait en quelque sorte des conflits pour moi (et prendrait du temps puisque j'avais beaucoup d'historique).

91voto

dan_waterworth Points 3169

C'est l'approche que je privilégie :

git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})

Cela créera une nouvelle branche avec un seul commit qui ajoutera tout ce qui se trouve dans HEAD. Cela ne modifie rien d'autre, donc c'est complètement sûr.

31voto

C.. Points 10739

L'autre option, qui peut s'avérer être beaucoup de travail si vous avez beaucoup de commits, est un rebasement interactif (en supposant que votre version de git est >=1.7.12) : git rebase --root -i

Lorsqu'une liste de commits est présentée dans votre éditeur :

  • Changer "pick" en "reword" pour le premier commit
  • Changer "pick" en "fixup" tous les deux commit

Sauvegarder et fermer. Git va commencer à rebaser.

À la fin, vous aurez un nouveau commit Root qui est une combinaison de tous ceux qui sont venus après lui.

L'avantage est que vous n'avez pas à supprimer votre dépôt et que si vous avez des doutes, vous avez toujours une solution de repli.

Si vous voulez vraiment effacer votre historique, réinitialisez master à ce commit et supprimez toutes les autres branches.

18voto

lalebarde Points 271

Variante de larsmans La méthode proposée par la Commission européenne :

Sauvegardez votre liste d'untrackfiles :

git ls-files --others --exclude-standard > /tmp/my_untracked_files

Sauvegardez votre configuration git :

mv .git/config /tmp/

Ensuite, exécutez les premières étapes de Larsmans :

rm -rf .git
git init
git add .

Restaurez votre configuration :

mv /tmp/config .git/

Déverrouillez les fichiers non verrouillés :

cat /tmp/my_untracked_files | xargs -0 git rm --cached

Alors, engagez-vous :

git commit -m "Initial commit"

Et enfin pousser vers votre dépôt :

git push -u --force origin master

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X