У мене є робоча копія проекту, без жодних метаданих контролю джерела. Тепер я хотів би зробити еквівалент git-clone в цій папці та зберегти мої локальні зміни.
git-clone не дозволяє мені клонуватись у існуючу папку. Яка тут найкраща практика?
У мене є робоча копія проекту, без жодних метаданих контролю джерела. Тепер я хотів би зробити еквівалент git-clone в цій папці та зберегти мої локальні зміни.
git-clone не дозволяє мені клонуватись у існуючу папку. Яка тут найкраща практика?
Відповіді:
Це можна зробити, клонувавши до нового каталогу, потім перемістивши .git
каталог у існуючий каталог.
Якщо ваш існуючий каталог має назву "код".
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
Це також можна зробити, не роблячи замовлення під час команди клонування; більше інформації можна знайти тут .
git clone
в якості першої команди, подальша команда перевірки не потрібна. Якщо ви замість цього використовуєте щось подібне git clone --no-checkout
на цьому першому кроці, то після переміщення каталогу .git необхідно git reset HEAD
буде сказати git, що файли не видалено.
git status
.
Не клонуйте, замість цього прийміть. У репо:
git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default
Тоді ви можете скинути дерево, щоб отримати потрібну команду:
git reset origin/master # or whatever commit you think is proper...
і ти, як ти клонований.
Цікаве запитання тут (і те, що не має відповіді): як дізнатись, на якому ґрунті ґрунтувалося ваше оголене дерево, звідси на яку посаду потрібно повернутись.
Я зробив наступне, щоб перевірити головну гілку в існуючому каталозі:
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
-t
тут використовується прапор?
Я б git clone
у новий каталог і скопіював вміст існуючого каталогу в новий клон.
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
Іншими словами, переміщення .git
dir з тимчасового клону здається простішим, ніж очищення робочого дерева клону та копіювання наявних файлів туди.
git mv tmp/.git .
повертається fatal: cannot move directory over file, source=tmp/.git, destination=.git
за мною. Хтось знає, в чому проблема?
mv
, а не git mv
; хоча це не пояснює, чому у вас вже є .git
файл (що містить gitdir: some/path/to/a/git-dir
"gitfile"; якби його не було, то ви б бачили fatal: Not a git repository (or any of the parent directories): .git
замість цього).
Використання тимчасової директорії чудово, але це спрацює, якщо ви хочете уникнути цього кроку. З кореня робочого каталогу:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git reset --hard origin/master
видалить усі локальні файли.
hard
і mixed
полягає в тому, що змішані будуть зберігати локальні зміни (тому, якщо пізніше ви спробуєте витягнути це, ви побачите, наприклад, Неможливо потягнути за допомогою ребазування: У вас є незроблені зміни. Будь ласка, введіть або приховайте їх ) , тоді як важко
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
git reset --hard
призведе до зменшення змін у локальному файлі, зокрема НЕ того, що вимагала ця ОП. --mixed
слід використовувати замість цього.
Для клонування git repo в порожній існуючий каталог виконайте наступне:
cd myfolder
git clone https://myrepo.com/git.git .
Зауважте .
в кінці вашої git clone
команди. Це завантажить репо в поточний робочий каталог.
fatal: destination path '.' already exists and is not an empty directory.
До цього існує два підходи. Де це можливо, я б почав із чистої папки для нового каталогу git, а потім скопіював би вашу версію речей. Це може виглядати приблизно як *:
mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig
На даний момент у вас повинна бути досить чиста робоча копія з попередньою робочою папкою як поточна робоча директорія, тому будь-які зміни, включаючи видалення файлів, з’являться на радарі, якщо ви запустите git status
.
З іншого боку, якщо ви дійсно повинні це робити навпаки, ви можете отримати той самий результат приблизно таким чином:
cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD
У будь-якому випадку, перше, що я б зробив, це запустити щось на кшталт того, git stash
щоб отримати копію всіх відкладених вами локальних змін, потім ви можете повторно застосувати їх і працювати над тим, які з них ви хочете зробити.
* Обидва приклади передбачають, що ви починаєте з оболонки в батьківському каталозі свого проекту.
Це найкращий з усіх методів, які я натрапив
Клоніруйте лише папку .git у сховищі (виключаючи файли, оскільки вони вже є existing-dir
) у порожній тимчасовий каталог
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
// можливо, захочеться --no-hardlinks для клонування місцевого репоПеремістіть папку .git до каталогу з файлами. Це робить existing-dir
git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/
Видаліть тимчасовий каталог
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git вважає, що всі файли видалені, це повертає стан репо до HEAD.
УВАГА: будь-які локальні зміни файлів будуть втрачені.
git reset --mixed HEAD
Якщо ви використовуєте принаймні git 1.7.7 (що вчив clone
цю --config
опцію), щоб перетворити поточний каталог у робочу копію:
git clone example.com/my.git ./.git --mirror --config core.bare=false
Це працює:
.git
папці--mirror
робить новий клон в папку з метаданими як .git
потрібно--config core.bare=false
countermands неявне bare=true
з --mirror
опції, тим самим дозволяючи сховище мати відповідний робочий каталог і діяти як звичайний клонЦе очевидно не буде працювати, якщо в .git
каталозі, який ви хочете перетворити на робочу копію, вже існує каталог метаданих.
[core]
розділу локальної конфігурації, що включає обидва bare = true
та bare = false
. Більш проблематичним є те, що він буде мати неправильні значення для origin
віддаленого пристрою, [remote "origin"]
включаючи розділ mirror = true
і специфікацію для отримання, яка не працюватиме належним чином з робочою копією. Після виправлення цих проблем нормальне клонування та переміщення нової робочої копії .git
будуть ефективнішими.
Зазвичай я спершу клоную початковий сховище, а потім переміщу все в існуючій папці до початкового сховища. Це працює щоразу.
Перевага цього методу полягає в тому, що ви не пропустите нічого в початковому сховищі, включаючи README або .gitignore.
Ви також можете скористатися командою нижче для завершення кроків:
$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo
Це можна зробити, ввівши наступні командні рядки рекурсивно:
mkdir temp_dir // Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory