Faire de la validation actuelle une validation unique (initiale) dans le référentiel git?

Actuellement, j'ai un référentiel Git local, sur lequel je clique sur le référentiel Github.

Le référentiel local a ~ 10 validations et le référentiel Github en est une copie synchronisée.

Ce que je voudrais faire est de supprimer TOUS les historiques de versions du référentiel Git local, afin que le contenu du référentiel actuel soit affiché comme le seul commit (et par conséquent, les anciennes versions des fichiers du référentiel ne sont pas enregistrées),

Je voudrais cliquer sur ces modifications dans Github.

J'ai exploré Git rebase, mais cela semble plus approprié pour supprimer certaines versions. Une autre solution potentielle consiste à supprimer le référentiel local et à en créer un nouveau, même si cela créerait probablement beaucoup de travail!

ETA: Certains répertoires / fichiers ne sont pas surveillés - si possible, j'aimerais pouvoir prendre en charge la désactivation de ces fichiers.

460
13 марта '12 в 14:41 2012-03-13 14:41 kaese est fixé le 13 mars 12 à 14h41 2012-03-13 14:41
@ 14 réponses

Voici une approche de force brute. Il supprime également la configuration du référentiel.

Note Cela ne marche PAS s'il y a des sous-modules dans le référentiel! Si vous utilisez des sous-modules, vous devez utiliser, par exemple, un redémarrage interactif.

Étape 1: effacez l'historique complet ( assurez-vous d'avoir une sauvegarde, il est impossible de la renvoyer )

 rm -rf .git 

Étape 2: restaurer le référentiel Git avec le contenu actuel uniquement

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

Étape 3: Cliquez sur GitHub.

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 La réponse est donnée par Fred Foo le 13 mars 12 à 14:44 2012-03-13 14:44

La seule solution qui fonctionne pour moi (et les sous-modules fonctionnent) est

 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 
border=0

Supprimer .git/ pose toujours de gros problèmes lorsque j'ai des sous-modules. Utiliser git rebase --root provoquera en quelque sorte des conflits pour moi (et j'ai beaucoup d'histoire).

410
27 окт. réponse donnée à Zeelot le 27 octobre. 2012-10-27 21:16 '12 à 21:16 2012-10-27 21:16

C'est mon approche favorable:

 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 à HEAD. Cela ne change rien, donc c'est totalement sûr.

63
22 марта '13 в 16:53 2013-03-22 16:53 la réponse est donnée dan_waterworth 22 mars '13 à 16:53 2013-03-22 16:53

Une autre option qui peut nécessiter beaucoup de travail si vous avez beaucoup de commits est une rebase interactive (si votre version de git est> 1.7.12): git rebase --root -i

Lorsque vous présentez une liste de commits dans votre éditeur:

  • Remplacez "pick" par "reword" pour le premier commit
  • Remplacez "pick" par "fixup" tous les autres commit

Sauvegarder et fermer. git va redémarrer.

À la fin, vous aurez un nouveau dispositif de retenue de racine, qui combine tous ceux qui sont venus après.

L'avantage est que vous n'avez pas besoin de supprimer votre référentiel, et si vous avez d'autres idées en tête, vous avez toujours une réserve.

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

26
14 марта '12 в 23:24 2012-03-14 23:24 la réponse est donnée par Carl le 14 mars 12 à 23:24 2012-03-14 23:24

La suppression du dossier .git peut entraîner des problèmes dans le référentiel git. Si vous souhaitez supprimer l’ensemble de votre historique de fixation.

suivez ces étapes:

étape 1 (paiement)

 git checkout --orphan latest_branch 

étape 2 (ajouter tous les fichiers)

 git add -A 

Étape 3 (Valider les modifications)

 git commit -am "commit message" 

étape 4 (Supprimer une branche)

 git branch -D master 

étape 5 (renommer la branche actuelle en maître)

 git branch -m master 

Étape 6 (étape finale, pouvoir de mettre à jour votre référentiel)

 git push -f origin master 

!! Profitez maintenant de l'histoire de la fixation!

21
14 окт. la réponse est donnée par Shivam Srivastava le 14 octobre. 2017-10-14 12:08 '17 à 12:08 2017-10-14 12:08

Variante de la méthode proposée par larsmans:

Enregistrez la liste des fichiers non-imprimables:

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

Enregistrez la configuration de git:

 mv .git/config /tmp/ 

Suivez ensuite les premières étapes de larsmans:

 rm -rf .git git init git add . 

Restaurez la configuration:

 mv /tmp/config .git/ 

Jeter les fichiers non testés:

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

Puis fixez:

 git commit -m "Initial commit" 

Enfin, cliquez sur votre référentiel:

 git push -u --force origin master 
14
19 апр. réponse donnée par lalebarde le 19 avril 2014-04-19 11:58 14 à 11:58 2014-04-19 11:58

Créez une branche, copiez-y tout le contenu, copiez-la, puis supprimez la branche principale:

 git checkout --orphan newBranch; git add -A ;git commit -am 'first commit' ;git branch -D master;git branch -m master; git push -f origin master; git gc --aggressive --prune=all 
5
12 марта '17 в 17:53 2017-03-12 17:53 la réponse est donnée pratik_bhavsar le 12 mars 17 à 17:53 2017-03-12 17:53

Vous pouvez utiliser des clones peu profonds (git> 1.9):

 git clone --depth depth remote-url 

Lectures supplémentaires: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. la réponse est donnée par Matthias M 04 apr. 2016-04-04 14:05 '16 à 14h05 2016-04-04 14h05

La méthode ci-dessous est reproductible. Il n'est donc pas nécessaire de redémarrer le clone. Si les deux côtés sont cohérents, exécutez simplement le script de l'autre côté.

 git log -n1 --format=%H >.git/info/grafts git filter-branch -f rm .git/info/grafts 

Si vous voulez le nettoyer, essayez le script:

http://sam.nipl.net/b/git-gc-all-ferocious

J'ai écrit un script qui "tue l'historique" pour chaque branche du référentiel:

http://sam.nipl.net/b/git-kill-history

Voir aussi: http://sam.nipl.net/b/confirm

2
06 февр. La réponse a été donnée par Sam Watkins le 06 février. 2013-02-06 19:46 '13 à 19:46 2013-02-06 19:46
 git for-each-ref --format='git update-ref -d %(refname)' \ refs/{heads,tags} | sh -x current=$(git commit-tree -m 'Initial commit' `git write-tree`) git update-ref -m 'Initial commit' `git symbolic-ref HEAD` $current 

Cela supprime toutes les branches et les étiquettes locales, crée un événement sans historique avec le statut de votre chèque actuel dans n’importe quelle branche de celui-ci et laisse tout le reste de votre dépôt intact. Vous pouvez ensuite cliquer avec force sur vos télécommandes à votre guise.

1
05 апр. la réponse est donnée jthill 05 avril 2014-04-05 04:42 '14 à 4:42 2014-04-05 04:42

Ce que je voudrais faire est de supprimer TOUS les historiques de versions du référentiel Git local, afin que le contenu du référentiel actuel soit affiché comme le seul commit (et par conséquent, les anciennes versions des fichiers du référentiel ne sont pas enregistrées),

Réponse plus conceptuelle:

git automatiquement ramasse les anciennes commises si les balises / branches / liens ne les pointent pas. Ainsi, il vous suffit de supprimer toutes les balises / branches et de créer une nouvelle validation orpheline associée à une branche. Par accord, vous autoriserez la branche principale à indiquer cette validation.

Personne ne pourra plus jamais voir les anciens commits inaccessibles, à moins qu'ils ne se plongent dans les commandes Git de bas niveau. Si cela vous suffit, je vais simplement m'arrêter là et laisser le CPG automatique le faire à tout moment. Si vous voulez vous en débarrasser immédiatement, vous pouvez utiliser git gc (peut-être avec --aggressive --prune=all ). Pour un référentiel Git distant, vous ne pourrez le faire que si vous avez accès au système de fichiers.

0
04 апр. la réponse est donnée par AnoE 04 apr. 2016-04-04 14:27 '16 à 14h27 2016-04-04 14:27

Pour ce faire, utilisez la commande Shallow Clone git clone --depth 1 URL - cela ne fera que cloner le référentiel HEAD actuel.

-1
23 авг. La réponse est donnée par kkarki 23 août. 2017-08-23 18:55 '17 à 18h55 2017-08-23 18h55

Pour supprimer le dernier commit de git, vous pouvez simplement lancer

 git reset --hard HEAD^ 

Si vous supprimez plusieurs commits ci-dessus, vous pouvez exécuter

 git reset --hard HEAD~2 

supprimer les deux derniers commits. Vous pouvez augmenter le nombre pour supprimer encore plus de commits.

Plus d'informations ici.

Git tutoturial fournit ici une aide pour vider le référentiel:

Vous souhaitez supprimer le fichier de l'historique et l'ajouter à .gitignore pour vous assurer qu'il ne se répète pas accidentellement. Pour nos exemples, nous allons supprimer le fichier Rakefile du référentiel github gem.

 git clone https://github.com/defunkt/github-gem.git cd github-gem git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch Rakefile' \ --prune-empty --tag-name-filter cat -- --all 

Maintenant que nous avons supprimé le fichier de l'historique, garantissons que nous ne le ferons pas par accident.

 echo "Rakefile" >> .gitignore git add .gitignore git commit -m "Add Rakefile to .gitignore" 

Si vous êtes satisfait de l'état du référentiel, vous devez forcer les modifications à remplacer le référentiel distant.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 la réponse est donnée octobre 05 juin '13 à 8:41 2013-06-05 08:41

J'ai résolu un problème similaire en supprimant simplement le dossier .git de mon projet et en réintégrant le contrôle de version via IntelliJ. Note Le dossier .git est masqué. Vous pouvez l'afficher dans le terminal avec ls -a , puis le supprimer avec rm -rf .git .

-1
11 апр. Réponse donnée par JB Lovell le 11 avril 2017-04-11 21:54 '17 à 21h54 le 2017-04-11 21h54

Autres questions sur tags ou Poser une question