Skopiuj repozytorium git bez historii

200

Obecnie mam prywatne repozytorium na githubie, które chcę upublicznić. Jednak niektóre z początkowych zatwierdzeń zawierają informacje, których nie chcę upubliczniać (twarde kody itp.).

Jaka jest najłatwiejsza droga do upublicznienia ostatniego zatwierdzenia (tak naprawdę nie potrzebuję ani nie chcę poprzednich zatwierdzeń w publicznym repozytorium) bez uwzględnienia części lub całej historii zatwierdzeń?

Rafe
źródło
Dlaczego nie utworzysz nowego repozytorium?
Stephan
2
@Stephan W porządku jest tworzenie nowego repozytorium, ale jak złapać najnowszy stan ze starego repozytorium i zatwierdzić go do nowego?
Rafe
19
możesz po prostu usunąć folder .git i ponownie uruchomić git init w folderze, z którego pochodzą
Stephan
2
Usunięcie folderu .git sprawi, że twoje dwa repozytoria będą niekompatybilne, nie będziesz mógł scalić się między sobą
Arnold Roa
Nie możesz tego zmienić? Dosłownie po prostu zmiażdżysz wszystkie stare zmiany, a następnie (wymusisz) pchanie.
xaxxon

Odpowiedzi:

321

Możesz ograniczyć głębokość historii podczas klonowania :

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

Użyj tego, jeśli chcesz mieć ograniczoną historię, ale nadal trochę.

Gauthier
źródło
40
Daj temu człowiekowi ciasteczko (w postaci oznaczenia poprawnej odpowiedzi) :)
FateNuller
7
Nie dotyczy to zamierzonego użycia wynikającego z pytania, które ma być możliwe wypchnięcie do zdalnego publicznego repozytorium. Próba wypchnięcia płytkiego klonu skutkuje shallow update not allowed.
Brad Knox,
279

Użyj następującego polecenia:

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

Gdzie:

  • depthto liczba zatwierdzeń, które chcesz uwzględnić. tzn. jeśli chcesz tylko użyć najnowszego zatwierdzeniagit clone --depth 1
  • branchto nazwa zdalnego oddziału, z którego chcesz sklonować. tzn. jeśli chcesz ostatnie 3 zatwierdzenia z masterużycia oddziaługit clone --depth 3 -b master
  • repo_url to adres URL twojego repozytorium
Agam Rafaeli
źródło
7
To jest właściwie ta sama odpowiedź niż Gautier, ale bardziej kompletna i na przykład.
aled
3
Rzeczywiście jest. Czasami potrzebny jest przykład. Dla mnie wyjaśnienie problemu wyjaśniło sprawę
Agam Rafaeli
3
+1 do głównej odpowiedzi, ale także do tej, która wyjaśnia, jak wybrać gałąź, do której chcesz zastosować głębokość - Wiem, że jest to część polecenia klonowania - ale to wszystko ładnie łączy mnie w mojej prostej głowie ... a ja jak proste
:)
7
Jak to odpowiada na pytanie? Wszystko to tworzy lokalnie płytki klon, ale co wtedy? Jak skopiować kopię lokalną z ograniczoną historią do nowego repozytorium?
BradDaBug
4
@BradDaBug porusza ważny punkt. Postępowałem zgodnie z powyższymi instrukcjami, ograniczając głębokość do 1, następnie zmieniłem zdalne źródło, a następnie próbowałem przeforsować moje nowe repo. Otrzymałem jednak komunikat o błędzie shallow update not allowed. Uważam, że odpowiedź na przepełnienie stosu jest przydatna w tym przypadku.
Craig Myles,
18

Usunięcie .gitfolderu jest prawdopodobnie najłatwiejszą ścieżką, ponieważ nie chcesz / nie potrzebujesz historii (jak powiedział Stephan).

Możesz więc utworzyć nowe repozytorium z ostatniego zatwierdzenia: ( Jak sklonować projekt seed / kick-start bez całej historii? )

git clone <git_url>

następnie usuń .git, a następnie uruchom

git init

A jeśli chcesz ponownie użyć bieżącego repozytorium: czy bieżące zatwierdzenie jest jedynym (początkowym) zatwierdzeniem w repozytorium Git?

Następnie wykonaj powyższe kroki:

git add .
git commit -m "Initial commit"

Przejdź do swojego repozytorium.

git remote add origin <github-uri>
git push -u --force origin master
JW
źródło
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
źródło
2
--depth 1jest konieczne w tym przypadku, ponieważ historia jest również usunięte zrm -rf .git
rayphi
3
Myślę, że zrobiłbym to w ten sposób: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 tak, --depth 1jest to niepotrzebne, ale jest również nieszkodliwe i pozwala zaoszczędzić trochę przepustowości sieci (nie ma sensu pobieranie historii, którą zamierzasz usunąć)
Silas S. Brown
1
Nie polecam tego robić, jeśli chcesz zachować kompatybilność swoich repozytoriów.
Arnold Roa
Usunięcie .git powoduje również usunięcie wszystkich haczyków git.
JudaPriest
0

Czy nie dokładnie to robi zgniatanie bazy? Po prostu zmiażdż wszystko z wyjątkiem ostatniego zatwierdzenia, a następnie (wymuś) wciśnij.

xaxxon
źródło