Copie un repositorio de git sin historial

200

Actualmente tengo un repositorio privado en github que quiero hacer público. Sin embargo, algunas de las confirmaciones iniciales contienen información que no quiero hacer pública (credenciales codificadas, etc.).

¿Cuál es la ruta más fácil para hacer público el último commit (realmente no necesito o quiero los commits anteriores en el repositorio público) sin incluir parte o todo el historial de commit?

Rafe
fuente
¿Por qué no creas un nuevo repositorio?
Stephan
2
@Stephan Estoy bien creando un nuevo repositorio, pero ¿cómo engancho el último estado del antiguo repositorio y lo confirmo en el nuevo?
Rafe
19
puede simplemente eliminar la carpeta .git y hacer un git init nuevamente en la carpeta donde están sus fuentes
Stephan
2
Eliminar la carpeta .git hará que sus dos repositorios sean incompatibles, no podrá fusionarse de uno a otro
Arnold Roa
¿No puedes rebasarlo? Literalmente, simplemente aplastas todos los commits antiguos y luego (forzas) empujar.
xaxxon

Respuestas:

322

Puede limitar la profundidad de la historia mientras clona :

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

Úselo si desea un historial limitado, pero aún algunos.

Gauthier
fuente
41
Dele a este hombre una galleta (en forma de marcar esta respuesta correcta) :)
FateNuller
77
Esto no aborda el uso previsto que implica la pregunta, que es poder enviar a un repositorio público remoto. Intentar empujar un clon superficial da como resultado shallow update not allowed.
Brad Knox
280

Use el siguiente comando:

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

Dónde:

  • depthes la cantidad de confirmaciones que desea incluir. es decir, si solo quieres el último uso de commitgit clone --depth 1
  • branches el nombre de la rama remota desde la que desea clonar. es decir, si desea las últimas 3 confirmaciones del masteruso de la ramagit clone --depth 3 -b master
  • repo_url es la url de tu repositorio
Agam Rafaeli
fuente
77
Esta es en realidad la misma respuesta que Gautier pero más completa y con un ejemplo.
aled
3
De hecho, es. A veces el ejemplo es lo que se necesita. Para mí, escribirlo es lo que aclaró el problema
Agam Rafaeli
3
+1 a la respuesta principal, pero también a esta para explicar cómo seleccionar a qué rama desea aplicar la profundidad, sé que esto es parte del comando clonar, pero en mi mente simple lo une todo muy bien ... y me gusta simple
:)
77
¿Cómo responde esto a la pregunta? Todo lo que hace es crear un clon superficial a nivel local, pero ¿entonces qué? ¿Cómo se copia esta copia local con historial limitado en un nuevo repositorio?
BradDaBug
44
@BradDaBug muestra un punto válido. Seguí las instrucciones anteriores limitando la profundidad a 1, luego cambié el origen remoto y luego traté de pasar a mi nuevo repositorio. Sin embargo, recibí un error que indica shallow update not allowed. Encontré que esta respuesta de desbordamiento de pila es útil en esta instancia.
Craig Myles
18

La eliminación de la .gitcarpeta es probablemente la ruta más fácil ya que no desea / necesita el historial (como dijo Stephan).

Para que pueda crear un nuevo repositorio desde su último commit: ( ¿Cómo clonar el proyecto seed / kick-start sin toda la historia? )

git clone <git_url>

luego eliminar .git, y luego ejecutar

git init

O si desea reutilizar su repositorio actual: ¿ Hacer que la confirmación actual sea la única confirmación (inicial) en un repositorio Git?

Siga los pasos anteriores y luego:

git add .
git commit -m "Initial commit"

Empuje a su repositorio.

git remote add origin <github-uri>
git push -u --force origin master
JW
fuente
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:[email protected]/$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
timo kranz
fuente
2
el --depth 1es innecesaria en este caso porque la historia también se elimina conrm -rf .git
rayphi
3
Creo que lo haría así:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <[email protected]>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
rayphi
11
@rayphi sí, --depth 1es innecesario, pero también es inofensivo y ahorra un poco de ancho de banda de red (no tiene sentido buscar un historial que está a punto de eliminar de todos modos)
Silas S. Brown
1
No recomiendo hacer esto si desea mantener sus repositorios compatibles.
Arnold Roa
Al eliminar .git también se eliminan todos los ganchos de git.
JudaPriest
0

¿No es esto exactamente lo que hace aplastar un rebase? Simplemente aplasta todo excepto el último commit y luego (fuerza) empujarlo.

xaxxon
fuente