Copia un repository git senza cronologia


200

Al momento ho un repository privato su github che voglio rendere pubblico. Tuttavia, alcuni dei commit iniziali contengono informazioni che non voglio rendere pubbliche (credenziali codificate, ecc.).

Qual è la via più semplice per rendere pubblico l'ultimo commit (non ho davvero bisogno o non voglio i precedenti commit nel repository pubblico) senza includere parte o tutta la cronologia dei commit?


Perché non crei un nuovo repository?
Stephan,

2
@Stephan Sto bene creando un nuovo repository, ma come posso ottenere l'ultimo stato dal vecchio repository e assegnarlo al nuovo?
Rafe,

19
puoi semplicemente eliminare la cartella .git ed eseguire nuovamente git init sulla cartella in cui si trovano le tue fonti
Stephan

2
L'eliminazione della cartella .git renderà incompatibili i tuoi due repository, non sarai in grado di unire l'uno dall'altro
Arnold Roa,

Non puoi rifarlo? Basta letteralmente schiacciare tutti i vecchi commit e quindi (forzare) spingere.
xaxxon,

Risposte:


322

Puoi limitare la profondità della cronologia durante la clonazione :

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

Usa questo se vuoi una cronologia limitata, ma ancora un po '.


41
Dai a quest'uomo un biscotto (sotto forma di marcatura corretta di questa risposta) :)
FateNuller

7
Questo non riguarda l'uso previsto implicito nella domanda, che è quello di essere in grado di inviare a un repository pubblico remoto. Cercare di spingere un clone superficiale si traduce in shallow update not allowed.
Brad Knox,

280

Utilizzare il comando seguente:

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

Dove:

  • depthè la quantità di commit che desideri includere. vale a dire se si desidera solo l'uso dell'ultimo commitgit clone --depth 1
  • branchè il nome del ramo remoto da cui si desidera clonare. cioè se vuoi gli ultimi 3 commit masterdall'uso della filialegit clone --depth 3 -b master
  • repo_url è l'URL del tuo repository

7
Questa è in realtà la stessa risposta di Gautier ma più completa e con un esempio.
Aled

3
Certo che lo è. A volte l'esempio è ciò che è necessario. Per me, scriverlo è ciò che ha chiarito il problema
Agam Rafaeli il

3
+1 alla risposta principale, ma anche a questa per spiegare come selezionare a quale ramo vuoi applicare la profondità - so che fa parte del comando clone - ma lega tutto bene nella mia semplice mente ... e io come semplice
:)

7
Come risponde alla domanda? Tutto ciò che fa è creare un clone superficiale localmente, ma poi cosa? Come si copia questa copia locale con cronologia limitata in un nuovo repository?
BradDaBug,

4
@BradDaBug fa apparire un punto valido. Ho seguito le istruzioni sopra, limitando la profondità a 1, quindi ho cambiato l'origine remota e poi ho provato a spingere al mio nuovo repository. Tuttavia, ho ricevuto un errore indicante shallow update not allowed. Ho trovato utile questa risposta di overflow dello stack in questa istanza.
Craig Myles,

18

L'eliminazione della .gitcartella è probabilmente il percorso più semplice poiché non vuoi / hai bisogno della cronologia (come ha detto Stephan).

Quindi puoi creare un nuovo repository dal tuo ultimo commit: ( Come clonare il progetto seed / kick-start senza l'intera cronologia? )

git clone <git_url>

quindi eliminare .gite successivamente eseguire

git init

O se vuoi riutilizzare il tuo repository corrente: rendere il commit corrente l'unico commit (iniziale) in un repository Git?

Seguire i passaggi precedenti quindi:

git add .
git commit -m "Initial commit"

Invia al tuo repository.

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
l' --depth 1è inutile in questo caso perché la storia viene eliminato anche conrm -rf .git
rayphi

3
Penso che lo farei così: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 sì, --depth 1non è necessario ma è anche innocuo e salva un po 'di larghezza di banda di rete (inutile recuperare una cronologia che stai per eliminare comunque)
Silas S. Brown,

1
Non consiglio di farlo se si desidera mantenere compatibili i propri repository.
Arnold Roa,

Rimuovere .git rimuove anche tutti i git git.
JudaPriest,

0

Non è esattamente ciò che schiaccia un rebase? Basta schiacciare tutto tranne l'ultimo commit e poi (forzare) spingerlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.