Скопіюйте git repo без історії


200

Наразі у мене є приватне сховище на github, яке я хочу оприлюднити. Однак деякі початкові комісії містять інформацію, яку я не хочу оприлюднювати (жорсткі коди тощо).

Який найпростіший шлях для оприлюднення останніх комісій (я не дуже потребую або хочу, щоб попередні зобов’язання в загальнодоступному сховищі) не включали частину чи всю історію комісій?


Чому ви просто не створите новий сховище?
Стефан

2
@Stephan Я чудово створюю нове сховище, але як я перехоплюю останнє стан зі старого сховища і призначаю його до нового?
Rafe

19
ви можете просто видалити .git папку і знову зробити git init у папці, де є ваші джерела
Stephan

2
Видалення папки .git зробить ваші два сховища несумісними, ви не зможете об'єднатись з одного в інший
Арнольд Роа,

Ви не можете його відновити? Ви буквально просто розминаєте всі старі зобов’язання і потім (змушуєте) натискати.
xaxxon

Відповіді:


321

Ви можете обмежити глибину історії під час клонування :

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

Використовуйте це, якщо ви хочете обмежити історію, але все-таки деяку.


40
Дайте цій людині печиво (у формі маркування цієї відповіді правильною) :)
FateNuller

7
Це не стосується передбачуваного використання, що має на увазі запитання, яке має змогу перейти до віддаленого, загальнодоступного сховища. Спроба підштовхнути неглибокий клон призводить до shallow update not allowed.
Бред Нокс

279

Використовуйте таку команду:

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

Де:

  • depth- це сума комісій, яку ви хочете включити. тобто, якщо ви просто хочете використовувати останнє використанняgit clone --depth 1
  • branchце назва віддаленої гілки, з якої ви хочете клонуватись. тобто, якщо ви хочете, щоб останні 3 коміти були masterвикористані у філіїgit clone --depth 3 -b master
  • repo_url URL-адреса вашого сховища

7
Це насправді та сама відповідь, що і Готьє, але більш повна і з прикладом.
aled

3
Справді так і є. Іноді прикладом є те, що потрібно. Як на мене, його роз'яснення пояснило це питання
Агам Рафаелі

3
+1 до основної відповіді, а також до цієї для пояснення щодо вибору гілки, до якої слід застосувати глибину - я знаю, що це частина команди клонування - але це все добре поєднує в моєму простому розумі ... і мені подобається просто
:)

7
Як це відповідає на питання? Все це - це створити мілководний клон локально, але що тоді? Як ви скопіюєте цю локальну копію з обмеженою історією до нового репо?
BradDaBug

4
@BradDaBug відображає дійсну точку. Я дотримувався наведених вище вказівок, обмеживши глибину на 1, потім змінив віддалене походження і потім спробував перейти до мого нового репо. Однак я отримав помилку, вказуючи shallow update not allowed. Я вважав, що відповідь на переповнення стека є корисною в цьому випадку.
Крейг Майлз

18

Видалення .gitпапки - це, мабуть, найпростіший шлях, оскільки вам не потрібно / не потрібна історія (як сказав Стефан).

Таким чином, ви можете створити нову репо-версію з останнього зобов’язання: ( Як клонувати насіннєвий / початковий проект без усієї історії? )

git clone <git_url>

потім видаліть .gitі після цього запустіть

git init

Або якщо ви хочете повторно використовувати своє поточне репо: Зробити поточний фіксатор єдиним (початковим) комітетом у сховищі Git?

Виконайте наведені вище кроки:

git add .
git commit -m "Initial commit"

Натисніть на репо.

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
--depth 1непотрібно в цьому випадку , тому що історія також видаляється зrm -rf .git
rayphi

3
Я думаю, я зробив би це так: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 так, --depth 1це зайве, але це також нешкідливо, і це економить невелику пропускну здатність мережі (немає сенсу витягувати історію, яку ви збираєтесь видалити)
Silas S. Brown

1
Я не рекомендую робити це, якщо ви хочете підтримувати свої сховища сумісними.
Арнольд Роа

Видалення .git також видаліть усі гачки git.
ІудаПріес

0

Хіба це не саме те, що робить ревізію? Просто розчавіть все, крім останнього вчинення, а потім (змусити) натиснути на нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.