Faire le commit courant le seul (initiale) de s'engager dans un dépôt Git?
J'ai actuellement un dépôt Git local, qui je pousse un dépôt Github.
Le référentiel local ~10 s'engage, et le dépôt Github est un synchronisée double de cette.
Ce que je voudrais faire est de retirer TOUTES les version de l'histoire à partir du dépôt Git local, de sorte que le contenu actuel du référentiel apparaît comme le seul commit (et donc les anciennes versions de fichiers dans le référentiel ne sont pas stockées).
Alors je dirais comme pour pousser ces changements de Github.
J'ai étudié Git rebase, mais cela semble être plus adaptée à la suppression des versions spécifiques.
Une autre solution est de supprimer le repo local, et en créer un nouveau - même si ce serait probablement de créer beaucoup de travail!
ETA: Il y a des fichiers /répertoires qui sont sans traces - si possible, je voudrais maintenir la untracking de ces fichiers.
- Voir aussi stackoverflow.com/questions/435646/... ("Comment puis-je combiner les deux premières s'engage d'un dépôt Git?")
- Peut-être liés: Comment puis-je combiner les deux premières s'engage d'un dépôt Git?.
- et ceci: Comment faire pour écraser tous git s'engage en un seul?
Vous devez vous connecter pour publier un commentaire.
Ici est la force brute de l'approche. Il supprime également la configuration du référentiel.
Note: Cela ne fonctionne PAS si le dépôt a submodules! Si vous utilisez des submodules, vous devriez utiliser, par exemple, rebase interactif
Étape 1: supprimer tout l'historique (assurez-vous que vous avez de sauvegarde, ce ne peut pas être annulée)
Étape 2: reconstruire le repo Git avec seulement le contenu actuel
Étape 3: appuyez sur pour GitHub.
.gitignore
doit traiter ceux, de droite?git commit -m "Initial commit"
alors vous pouvez probablement passer lagit remote add ...
partie, en supposant que c'était déjà dans votre config, et de passer directement à pousser. Il a travaillé pour moi..git
dossier peut causer des problèmes dans votre dépôt git. Si vous souhaitez supprimer tous vos commettre l'histoire, mais garder le code dans son état actuel, il est très sûr à le faire comme suit: stackoverflow.com/a/26000395/2019689La seule solution qui fonctionne pour moi (et continue à le submodules de travail) est
La suppression de
.git/
provoque toujours de gros problèmes quand j'ai des submodules.À l'aide de
git rebase --root
serait en quelque sorte à l'origine de conflits pour moi (et depuis longtemps j'ai eu beaucoup de l'histoire).git push -f origin master
comme la dernière op et le soleil brillera à nouveau sur vos frais de repo! 🙂git gc --aggressive --prune=all
. En outre, git va continuer à conserver l'historique de toutes les commits qui sont référencés avec des branches ou des étiquettes. Pour vérifier, exécutezgit tag -l
etgit branch -v
, puis supprimez tout ce que vous avez à trouver. Également double vérifier votre télécommande avecgit ls-remote
, vous devrez peut-être supprimer à distance tags/branches ou lorsque vous chercher, vous obtiendrez tous les fichiers liés de nouveau.git gc --aggressive --prune all
le point de perdre l'histoire serait manqué.git branch -m master old_master
et de définir le mode push à l'actuelle direction de la seulegit config --local push.default current
. De cette manière, on peut garder historique s'engage dans la branche distincte et de fonctionner en synchronisation avec repo dans la fraîcheur du maître.-f
. Cela va forcer la distance pensions être mis à jour avec la branche que vous avez créé localement.C'est mon approche préférée:
Cela va créer une nouvelle branche avec un commit qui ajoute tout dans la TÊTE. Il n'altère pas autre chose, donc il est complètement sûr.
git-rev-parse
docs. Ce qui se passe ici estgit-commit-tree
nécessite une référence à un arbre (un instantané de l'opération), maisHEAD
est une révision. Pour trouver l'arbre associé à un commit nous utilisons le<rev>^{<type>}
forme.git push --force <remote> new_branch_name:<remote-branch>
L'autre option, qui pourrait être beaucoup de travail si vous avez beaucoup de validations, est un rebase interactif (en supposant que votre version git est >=1.7.12):
git rebase --root -i
Lorsqu'ils sont présentés avec une liste de commits dans votre éditeur:
Enregistrer et fermer. Git va commencer à la relocalisation.
À la fin vous avez une nouvelle racine de commettre, qui est une combinaison de tous ceux qui sont venus après lui.
L'avantage est que vous n'avez pas à supprimer de votre référentiel et si vous avez des doutes, vous avez toujours une solution de repli.
Si vraiment vous ne voulez nuke votre histoire, réinitialisation maître à ce commit et supprimer toutes les autres branches.
error: failed to push some refs to
git push --force-with-lease
. force-avec-bail est utilisé parce que c'est moins destructeur que de --force.Variante de larsmanss'méthode proposée:
Enregistrer votre untrackfiles liste:
Enregistrer votre configuration git:
Puis effectuer larsmans premières étapes:
Restaurer votre configuration:
Annuler le suivi vous sans traces de fichiers:
Puis valider:
Et enfin pousser votre référentiel:
Vous pouvez utiliser peu profonde clones (git > 1.9):
Pour en savoir plus: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/
Ci-dessous est un script adapté de @Zeelot 's réponse. Il faut supprimer l'historique de toutes les branches, et pas seulement la branche master:
Cela a fonctionné pour ma part (je ne suis pas à l'aide de submodules).
git branch
comprendra un astérisque à côté de votre extrait de la branche, qui sera ensuite globbed, l'amenant à résoudre pour tous les fichiers ou dossiers que si ceux qui ont les noms de branche trop. Au lieu de cela, j'ai utiliségit branch --format="%(refname:lstrip=2)"
qui m'a donné tout les noms de branche.git push --force origin master
, ougit push --force-with-lease
? Apparemment, ce dernier est plus sûr (voir stackoverflow.com/questions/5509543/...)git filter-branch
est le principal instrument de chirurgie.--parent-filter
reçoit les parents sur l'entrée standard stdin et devrait imprimer le réécrit les parents sur la sortie standard (stdout); unixtrue
sorties avec succès et imprime rien, donc: pas de parents.@^!
est Git d'abréviation pour "la tête de s'engager, mais pas tout de ses parents". Puis supprimez tous les autres refs et les pousser à loisir.La méthode ci-dessous est exactement reproductibles, donc il n'y a pas besoin de courir clone de nouveau si les deux côtés sont compatibles, il suffit d'exécuter le script, de l'autre côté aussi.
Ensuite, si vous voulez le nettoyer, essayez ce script:
http://sam.nipl.net/b/git-gc-all-ferocious
J'ai écrit un script qui "tue l'histoire" pour chaque branche dans le référentiel:
http://sam.nipl.net/b/git-kill-history
voir aussi: http://sam.nipl.net/b/confirm
git-hash: not found
etSupport for <GIT_DIR>/info/grafts is deprecated
git log HEAD~${1:-0} -n1 --format=%H
, ici, sam.aiki.info/b/git-hash Il serait mieux de mettre tout ça dans un script pour la consommation publique. Si je n'ai jamais l'utiliser à nouveau, je pourrais comprendre comment le faire avec la nouvelle fonction qui remplace les "greffes".Plus conceptuel réponse:
git automatiquement des ordures collectionne les vieux s'engage si pas de tags/branches/refs point pour eux. Vous n'avez qu'à supprimer tous les tags/branches et de créer un nouveau orphelin s'engager, associée à n'importe quelle branche par la convention de vous laisser la direction de la
master
point à qui l'engagent.L'ancien, inaccessible s'engage ensuite ne plus jamais être vu par n'importe qui à moins de passer à creuser avec un faible niveau de commandes git. Si c'est assez pour vous, je voudrais juste arrêter là et de laisser l'automatique GC faire du travail chaque fois qu'il le souhaite. Si vous voulez vous débarrasser de tout de suite, vous pouvez utiliser
git gc
(éventuellement avec--aggressive --prune=all
). Pour les dépôts git distant, il n'y a aucun moyen pour vous de force que si, sauf si vous avez un accès shell à leur système de fichiers.Il suffit de supprimer le dépôt Github et en créer un nouveau. De loin la plus rapide, la plus facile et la méthode la plus sûre. Après tout, qu'avez-vous à gagner l'exécution de toutes les commandes dans la solution retenue lorsque tout ce que vous voulez, c'est la branche master avec un seul commit?
Ici, vous allez:
Également hébergé ici: https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743
J'ai résolu un problème similaire, tout simplement en supprimant le
.git
dossier de mon projet et de réinsertion avec le contrôle de version par le biais de l'Ide.Remarque: Le
.git
est un dossier caché. Vous pouvez l'afficher dans le terminal avecls -a
, puis l'enlever à l'aiderm -rf .git
.Pour que l'utilisation Clone simple commande
git clone --profondeur de 1 URL - Il des clones seulement l'actuel CHEF de l'référentiel
Plus d'infos ici.
Git tutoturial ici fournit de l'aide sur la façon de vider référentiel: