Ефективно използвайте Git и Dropbox заедно?

Как ефективно да използваме Git и Dropbox ?

1065
25 дек. зададен от n1kh1lp 25 dec. 2009-12-25 11:41 '09 в 11:41 2009-12-25 11:41
@ 20 отговора

Мисля, че Git на Dropbox е страхотно. Използвам го през цялото време. Имам няколко компютъра (два у дома и един на работа), които използвам Dropbox като централно хранилище. Тъй като не искам да я хоствам в обществена услуга и нямам достъп до сървър, на който винаги мога да го направя, Dropbox ще се погрижи за това, като синхронизира (много бързо) във фонов режим.

Настройката изглежда така:

 ~/project $ git init ~/project $ git add . ~/project $ git commit -m "first commit" ~/project $ cd ~/Dropbox/git ~/Dropbox/git $ git init --bare project.git ~/Dropbox/git $ cd ~/project ~/project $ git remote add origin ~/Dropbox/git/project.git ~/project $ git push -u origin master 

От там можете просто да клонирате ~/Dropbox/git/project.git който сте свързали с вашия Dropbox акаунт (или да споделите тази директория с хора), можете да изпълните всички обичайни операции на Git и те ще бъдат синхронизирани с всичките ви машини автоматично.

Написах блог пост за контрол на версиите , старата връзка е мъртва ) според моите разсъждения и как съм настроил средата си въз основа на моя опит в разработването на Ruby on Rails , но може да се приложи към всичко, наистина.

1354
25 дек. Отговор, даден от Dan McNevin 25 декември 2009-12-25 20:10 '09 в 20:10 2009-12-25 20:10

Правилният начин да направите това е да използвате git -remote-dropbox: https://github.com/anishathalye/git-remote-dropbox

Създаването на вашите голи репозиции в Dropbox причинява много проблеми. Аниш (създателят на библиотеката) го обяснява най-добре :

border=0

Основната причина за тези проблеми е, че клиентът на работния плот на Dropbox е предназначен за синхронизиране на файлове, а не в хранилища Git. Без специална обработка за хранилища Git, той не поддържа същите гаранции на Git. Операциите в отдалеченото хранилище вече не се извършват, атомните и паралелните операции или крайните срокове със синхронизация могат да повредят хранилището.

Традиционният контролен панел Git изпълнява код от страна на сървъра, за да извърши тази работа правилно, но не можем.

Решението. Това може да се реши правилно. Можете да използвате Git с Dropbox и да имате същите гаранции за сигурност и последователности като традиционното Git дистанционно управление, дори ако има няколко потребители и паралелни операции!

За потребителя това е толкова просто, колкото използването на Git-Remote-Dropbox, отдалечен Git помощник, който действа като прозрачен двупосочен мост между Git и Dropbox и запазва всички гаранции за традиционната Git конзола. Дори е безопасно да се използва с споделени папки, така че може да се използва за сътрудничество (yay неограничени частни репо с неограничени сътрудници!).

С помощта на Remote Assistance можете да използвате Dropbox като отдалечен Git и да продължите да използвате всички обичайни Git команди, като Git клонинг, gitpull и Git push, и всичко ще работи както се очаква.

88
26 авг. отговорът е даден clu 26 aug. 2015-08-26 02:25 '15 в 2:25 ч. 2015-08-26 02:25

Този отговор се основава на опита на Mercurial , а не на Git, но този опит показва, че използването на Dropbox по този начин изисква повредени хранилища, ако има дори вероятност да актуализирате същото хранилище на Dropbox от различни компютри по различно време (Mac, Unix, Windows в моя случай).

Нямам пълен списък на нещата, които могат да се объркат, но ето един конкретен пример, който ме ухапа. Всяка машина има своя собствена идея за символи, завършващи редове, и как горните и малки букви се обработват в имената на файловете. Dropbox и Git / Mercurial се справят по малко по различен начин (не помня точните разлики). Ако Dropbox актуализира хранилището зад Git / Mercurial, presto, счупеното хранилище. Това се случва незабавно и незабелязано, така че дори не знаете, че хранилището ви е повредено, докато не опитате да възстановите нещо.

След като изкопах една бъркотия, направихме това, така че използвах следната рецепта с голям успех и без признаци на проблеми. Просто преместете хранилището си от Dropbox. Използвайте Dropbox за всичко останало; документация, файлове с буркани , каквото и да е. И използвайте GitHub (Git) или Bitbucket (Mercurial), за да управлявате самото хранилище.И двете са безплатни, така че това не добавя нищо към цената и всеки инструмент сега играе на своите силни страни.

Изпълнението на Git / Mercurial на върха на Dropbox добавя нищо друго освен риск. Не правете това.

85
01 мая '11 в 23:48 2011-05-01 23:48 отговорът е даден Bradjcox 01 май '11 в 23:48 2011-05-01 23:48

Що се отнася до малки команди, използващи Dropbox:

Ако всеки разработчик разполага със собствено хранилище, достъпно за записване в Dropbox, което привлича само други разработчици, това прави лесно споделянето на кода без риск от корупция!

След това, ако искате да централизирате "mainline", можете да принудите един разработчик да управлява всички кликвания върху него от собственото си репо.

16
04 дек. отговор, даден на teh_senaus 04 декември. 2012-12-04 15:27 '12 в 15:27 2012-12-04 15:27

Не исках да слагам всичките си проекти в едно хранилище на Git и не исках да влизам и пускам този код за всеки отделен проект, така че направих скрипт Bash, който автоматизира процеса. Можете да го използвате в един или няколко директории - за да може той да направи кода в това съобщение за вас или да го направи на няколко проекта едновременно.

 #!/bin/sh # Script by Eli Delventhal # Creates Git projects for file folders by making the origin Dropbox. You will need to install Dropbox for this to work. # Not enough parameters, show help. if [ $# -lt 1 ] ; then cat<<HELP projects_to_git.sh -- Takes a project folder and creates a Git repository for it on Dropbox USAGE: ./projects_to_git.sh file1 file2 .. EXAMPLES: ./projects_to_git.sh path/to/MyProjectDir Creates a git project called MyProjectDir on Dropbox ./projects_to_git.sh path/to/workspace}" projectname="${projectname%.git}.git" ;; esac shift done # check if specified directories and project name exists if [ -z "${projectname}" ]; then echo "Error: Project name not specified" usage fi if [ ! -d "${remotedir}" ]; then echo "Error: Remote directory ${remotedir} does not exist" usage fi if [ ! -d "${masterdir}" ]; then echo "Error: Master directory ${masterdir} does not exist" usage fi #absolute paths remotedir="`( cd \"${remotedir}\"  pwd )`" masterdir="`( cd \"${masterdir}\"  pwd )`" #Make master git repository cd "${masterdir}" git init --bare "${projectname}" #make local repository and push to master cd "${remotedir}" echo -e "${gitignorefile}" > .gitignore # default .gitignore file git init git add . git commit -m "first commit" git remote add origin "${masterdir}/${projectname}" git push -u origin master #done echo "----- Locations -----" echo "Remote branch location: ${remotedir}" echo "Master branch location: ${masterdir}" echo "Project Name: ${projectname}" 

скрипта изисква само името на проекта. Тя ще създаде git хранилище в ~/Dropbox/git/ под определеното име и ще въведе цялото съдържание на текущата директория в новосъздадения клон на оригинала. Ако е посочено повече от едно име на проект, ще бъде използван аргументът за име на най-дясното име на проекта.

Опционално, аргументът на командата -r указва отдалечения клон, който ще щракне върху основния източник. Местоположението на главния източник на проект може също да бъде зададено с аргумента -m. Файлът .gitignore по подразбиране също се поставя в директорията на отдалечения клон. По подразбиране директорията и .gitignore параметрите са изброени в скрипта.

3
11 янв. отговорът е даден от ChisholmKyle 11 януари 2014-01-11 02:53 '14 в 2:53 2014-01-11 02:53

Сега, през 2014 г., използвах Git и Dropbox за около година и половина без проблеми. Някои точки обаче:

  • Всичките ми машини, използващи Dropbox са в Windows, различни версии (от 7 до 8) + 1 mac.
  • Не предавам хранилището на някой друг, така че аз съм единственият, който го модифицира.
  • git push тласка към изтрито хранилище, така че ако някога бъде повреден, лесно мога да го възстановя.
  • Трябваше да създам псевдоними в C:\Users използват mklink /D link target , защото някои библиотеки посочват абсолютни местоположения.
3
14 апр. Отговор, даден от Микаел Майер на 14 април 2014-04-14 11:07 '14 в 11:07 2014-04-14 11:07

Попаднах на подобен проблем и създадох малък скрипт за него. Идеята е да направите Dropbox възможно най-лесно с Git. В момента бързо въведох Ruby кода и ще добавя още по-скоро.

Скриптът е достъпен на https://github.com/nuttylabs/box-git .

2
20 сент. Отговорът е даден от Киран Мадипали 20 септември. 2012-09-20 16:02 '12 в 4:02 pm 2012-09-20 16:02

Друг подход:

Всички отговори досега, включително отговорът на @Dan , който е най-популярен, са свързани с идеята да се използва Dropbox за централизиране на общо хранилище, вместо да се използва услуга, ориентирана към git, например github, bitback и др.

Но, тъй като първоначалният въпрос не показва, че използването на "Git и Dropbox заедно ефективно" наистина означава, нека да работим по различен подход: "Използване на Dropbox за синхронизиране само на работната линия."

Практическото ръководство има следните стъпки:

  • в директорията на проекта се създава празна директория .git (например, mkdir -p myproject/.git )

  • Не синхронизирайте директорията .git с Dropbox. Ако използвате Dropbox: отидете на "Предпочитания", "Синхронизиране" и "Избор на папки за синхронизиране", където директорията .git трябва да бъде .git . Това ще премахне директорията .git .

  • изпълнете git init в директорията на проекта

Той също работи, ако вече съществува .git , и то само стъпка 2. Dropbox ще запази копие на git файлове на уебсайта.

Стъпка 2 ще принуди Dropbox да не синхронизира структурата на git системата, което е желания резултат за този подход.

Защо да използваме този подход?

  • При непроменените промени ще се създаде резервно копие на Dropbox и те ще бъдат синхронизирани между устройствата.

  • Ако Dropbox започне нещо при синхронизиране между устройства, git status и git diff ще бъдат по-удобни за разбиране.

  • Това спестява място в профила ви в Dropbox (цялата история няма да се съхранява там)

  • Той избягва проблемите, повдигнати от @dubek и @Ates в коментарите към @Dan отговора, както и проблеми, свързани с @clu в друг отговор .

Съществуването на отдалечено друго място (github и др.) Ще се справи с този подход перфектно.

Работата в различни индустрии носи някои проблеми, за които трябва да се погрижим:

  • Един потенциален проблем е, че Dropbox (ненужно?) Синхронизира потенциално много файлове при проверка на различни клонове.

  • Ако две или повече устройства за синхронизиране на Dropbox имат различни клонове, може да загубите неприети промени на двете устройства,

Един от начините за решаване на тези проблеми е да използвате git worktree да запазвате клонове в отделни директории.

1
23 февр. отговорът е даден от IBrum на 23 февруари 2018-02-23 03:20 '18 в 3:20 2018-02-23 03:20

За моите 2 цента Dropbox използва само за лична употреба, където не искате да се притеснявате за получаване на централен репо сървър. За всяко професионално развитие, вероятно ще създадете повече проблеми, отколкото решите, както вече споменахме няколко пъти в потока, Dropbox не е предназначен за този случай на употреба. Обаче, напълно безопасен метод за премахване на хранилища в Dropbox без допълнителни модули или инструменти на трети страни е да се използват пакетите. Имам следните псевдоними в .gitconfig за запазване на входа:

 [alias] bundle-push = "!cd \"${GIT_PREFIX:-.}\"  if path=\"$(git config remote.\"$1\".url)\"  [ \"${path:0:1}\" = / ]; then git bundle create \"$path\" --all  git fetch \"$1\"; else echo \"Not a bundle remote\"; exit 1; fi #" bundle-fetch = "!cd \"${GIT_PREFIX:-.}\"  if path=\"$(git config remote.\"$1\".url)\"  [ \"${path:0:1}\" = / ]; then git bundle verify \"$path\"  git fetch \"$1\"; else echo \"Not a bundle remote\"; exit 1; fi #" bundle-new = "!cd \"${GIT_PREFIX:-.}\"  if [ -z \"${1:-}\" -o -z \"${2:-}\" ]; then echo \"Usage: git bundle-new <file> <remote name>\"; exit 1; elif [ -e \"$2\" ]; then echo \"File exist\"; exit 1; else git bundle create \"$2\" --all  git remote add -f \"$1\" \"$(realpath \"$2\")\"; fi #" 

например:

 # Create bundle remote (in local repo) $ git bundle-new dropbox ~/Dropbox/my-repo.bundle # Fetch updates from dropbox $ git bundle-fetch dropbox # NOTE: writes over previous bundle. Thus, roughly equivalent to push --force --prune --all $ git bundle-push 
0
ответ дан Niklas Holm 07 апр. '18 в 10:49 2018-04-07 10:49