У мене є робоча копія проекту, без жодних метаданих контролю джерела. Тепер я хотів би зробити еквівалент 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Іншими словами, переміщення .gitdir з тимчасового клону здається простішим, ніж очищення робочого дерева клону та копіювання наявних файлів туди.
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-dirgit 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=falsecountermands неявне 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