Copiez un dépôt git sans historique


200

J'ai actuellement un dépôt privé sur github que je veux rendre public. Cependant, certains des commits initiaux contiennent des informations que je ne veux pas rendre publiques (informations d'identification codées en dur, etc.).

Quelle est la voie la plus simple pour rendre public le dernier commit (je n'ai pas vraiment besoin ou ne veux pas les commits précédents dans le dépôt public) sans inclure tout ou partie de l'historique des commit?


Pourquoi ne créez-vous pas simplement un nouveau référentiel?
Stephan

2
@Stephan Je vais bien créer un nouveau référentiel, mais comment récupérer le dernier état de l'ancien référentiel et le valider dans le nouveau?
Rafe

19
vous pouvez simplement supprimer le dossier .git et refaire un git init sur le dossier de vos sources
Stephan

2
La suppression du dossier .git rendra vos deux référentiels incompatibles, vous ne pourrez pas fusionner de l'un à l'autre
Arnold Roa

Tu ne peux pas le rebaser? Vous écrasez littéralement tous les anciens commits, puis (forcez).
xaxxon

Réponses:


322

Vous pouvez limiter la profondeur de l'historique lors du clonage :

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

Utilisez-le si vous voulez un historique limité, mais encore un peu.


41
Donnez à cet homme un cookie (sous forme de marquage de cette réponse correcte) :)
FateNuller

7
Cela ne répond pas à l'utilisation prévue impliquée par la question, qui est de pouvoir pousser vers un référentiel public distant. Essayer de pousser un clone peu profond se traduit par shallow update not allowed.
Brad Knox

280

Utilisez la commande suivante:

git clone --depth <depth> -b <branch> <repo_url>

Où:

  • depthest le nombre de validations que vous souhaitez inclure. c'est à dire si vous voulez juste la dernière utilisation de commitgit clone --depth 1
  • branchest le nom de la branche distante à partir de laquelle vous souhaitez cloner. c'est-à-dire si vous voulez que les 3 derniers commits proviennent de l' masterutilisation de la branchegit clone --depth 3 -b master
  • repo_url est l'url de votre référentiel

7
C'est en fait la même réponse que Gautier mais plus complète et avec un exemple.
aled

3
En effet, ça l'est. Parfois, l'exemple est ce qui est nécessaire. Pour moi, l'écrire est ce qui a clarifié le problème
Agam Rafaeli

3
+1 à la réponse principale, mais aussi à celle-ci pour avoir expliqué comment sélectionner la branche à laquelle vous souhaitez appliquer la profondeur - je sais que cela fait partie de la commande clone - mais elle relie tout cela dans ma tête ... et moi comme simple
:)

7
Comment cela répond-il à la question? Tout cela ne fait que créer un clone peu profond localement, mais alors quoi? Comment copiez-vous cette copie locale avec un historique limité dans un nouveau dépôt?
BradDaBug

4
@BradDaBug soulève un point valide. J'ai suivi les instructions ci-dessus en limitant la profondeur à 1, puis j'ai changé l'origine à distance, puis j'ai essayé de pousser vers mon nouveau dépôt. Cependant, j'ai reçu une erreur indiquant shallow update not allowed. J'ai trouvé cette réponse de débordement de pile utile dans ce cas.
Craig Myles

18

La suppression du .gitdossier est probablement le chemin le plus simple car vous ne voulez pas / n'avez pas besoin de l'historique (comme l'a dit Stephan).

Vous pouvez donc créer un nouveau référentiel à partir de votre dernier commit: ( Comment cloner un projet de démarrage / démarrage sans l'historique complet? )

git clone <git_url>

puis supprimez .git, puis exécutez

git init

Ou si vous souhaitez réutiliser votre référentiel actuel: faire de la validation actuelle la seule validation (initiale) dans un référentiel Git?

Suivez ensuite les étapes ci-dessus:

git add .
git commit -m "Initial commit"

Poussez vers votre repo.

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

6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:$pass@bitbucket.org/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master

2
les --depth 1 n'est pas nécessaire dans ce cas car l'historique est également supprimé avecrm -rf .git
rayphi

3
Je pense que je le ferais comme ceci:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <some@one.com>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
rayphi

11
@rayphi oui le --depth 1 c'est inutile, mais il est également inoffensif et il économise un peu de bande passante réseau (inutile de récupérer une histoire que vous êtes sur le point de supprimer de toute façon)
Silas S. Brown

1
Je ne recommande pas de le faire si vous souhaitez garder vos référentiels compatibles.
Arnold Roa

La suppression de .git supprime également tous les crochets git.
JudaPriest

0

N'est-ce pas exactement ce que fait l'écrasement d'un rebase? Écrasez tout, sauf le dernier commit, puis (forcez) le pousser.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.