Yanıtlar:
Dropbox'ta Git'in harika olduğunu düşünüyorum. Her zaman kullanıyorum. Dropbox'ı merkezi bir çıplak depo olarak kullandığım birden fazla bilgisayarım var (ikisi evde ve biri işte). Bir kamu hizmetinde barındırmak istemediğimden ve her zaman ssh yapabileceğim bir sunucuya erişimim olmadığından, Dropbox arka planda (çok hızlı) senkronize ederek bunu halleder.
Kurulum şöyle bir şeydir:
~/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
Oradan, ~/Dropbox/git/project.git
Dropbox hesabınızla ilişkilendirdiğiniz (veya bu dizini kişilerle paylaştığınız) klonlayabilirsiniz , tüm normal Git işlemlerini yapabilirsiniz ve bunlar diğer tüm makinelerinizle otomatik olarak senkronize edilir.
Akıl yürütmem ve ortamımı nasıl kurduğum hakkında Sürüm Denetimi'nde ( eski bağlantı ölü ) bir blog yazısı yazdım, Ruby on Rails geliştirme deneyimime dayanıyor , ama gerçekten her şeye uygulanabilir.
Bunu yapmanın doğru yolu git-remote-dropbox kullanmaktır: https://github.com/anishathalye/git-remote-dropbox
Dropbox'ta kendi çıplak repo'nuzu oluşturmak çok fazla soruna neden olur. Anish (kütüphanenin yaratıcısı) bunu en iyi açıklar :
Bu sorunların temel nedeni, Dropbox masaüstü istemcisinin Git depolarını değil dosyaları senkronize etmek için tasarlanmış olmasıdır. Git depoları için özel işlem yapılmazsa Git ile aynı garantileri sağlamaz. Uzak depodaki işlemler artık atomik değildir ve eşzamanlı işlemler veya senkronizasyon ile şanssız zamanlama havuzun bozulmasına neden olabilir.
Geleneksel Git uzaktan kumandaları, bunun düzgün çalışması için sunucu tarafında kod çalıştırır, ancak bunu yapamayız.
Çözüm: Bunu doğru bir şekilde çözmek mümkündür. Git'i Dropbox ile kullanmak ve birden fazla kullanıcı ve eşzamanlı işlem olsa bile geleneksel Git uzaktan kumandasıyla aynı güvenlik ve tutarlılık garantisine sahip olmak mümkündür!
Bir kullanıcı için, Git ve Dropbox arasında şeffaf bir çift yönlü köprü görevi gören ve geleneksel bir Git uzaktan kumandasının tüm garantilerini koruyan bir Git uzaktan yardımcısı olan git-remote-dropbox'ı kullanmak kadar basittir. Paylaşılan klasörlerle kullanmak bile güvenlidir, bu nedenle işbirliği için kullanılabilir (sınırsız ortak çalışanlarla sınırsız özel depolar yay!).
Uzaktan yardımla, Dropbox'ı Git uzaktan kumandası olarak kullanmak ve git clone, git pull ve git push gibi tüm normal Git komutlarını kullanmaya devam etmek mümkündür ve her şey beklendiği gibi çalışır.
Bu cevap Git'e değil Mercurial deneyimine dayanıyor , ancak bu deneyim Dropbox'ı bu şekilde kullanmanın, farklı makinelerde aynı Dropbox tabanlı depoyu çeşitli zamanlarda güncelleme şansınız olup olmadığını (Mac, Unix, benim durumumda Windows).
Yanlış gidebilecek şeylerin tam bir listesi yok, ama işte beni ısırtan belirli bir örnek. Her makinenin kendi satır sonu karakterleri kavramı ve dosya adlarında büyük / küçük harf karakterlerinin nasıl işlendiği vardır. Dropbox ve Git / Mercurial bunu biraz farklı şekilde ele alıyor (kesin farklılıkları hatırlamıyorum). Dropbox, Git / Mercurial'ın arkasındaki, önceden ayarlanmış, bozuk deponun arkasındaki havuzu güncellerse. Bu hemen ve görünmez bir şekilde gerçekleşir, bu yüzden deponuzun bir şeyleri kurtarmaya çalışana kadar bozulduğunu bile bilmezsiniz.
İşleri bu şekilde yaparak bir karmaşadan çıktıktan sonra, aşağıdaki tarifi büyük bir başarı ile ve problem belirtisi kullanmıyorum. Deponuzu Dropbox'ın dışına taşımanız yeterlidir. Diğer her şey için Dropbox kullanın; belgeler, JAR dosyaları , lütfen istediğiniz herhangi bir şey. Ve kullanmak GitHub (Git) veya Bitbucket deposunu kendisi yönetmek için (Mercurial). Her ikisi de ücretsizdir, bu da maliyetlere hiçbir şey katmaz ve her araç şimdi güçlü yönlerine oynar.
Git / Mercurial'ı Dropbox'ın üstünde çalıştırmak risk dışında bir şey katmaz. Yapma.
Dropbox kullanan küçük ekiplerle ilgili olarak:
Her geliştiricinin yalnızca diğer geliştiricilere yönelik olan Dropbox'ta kendi yazılabilir çıplak deposu varsa, bu yolsuzluk riski olmadan kod paylaşımını kolaylaştırır!
Ardından, merkezi bir 'ana hat' istiyorsanız, bir geliştiricinin tüm itmeleri kendi repolarından yönetmesini sağlayabilirsiniz.
Tüm projelerimi bir Git deposunun altına koymak istemedim, içeri girmek ve bu kodları her proje için çalıştırmak istemedim, bu yüzden süreci otomatikleştirecek bir Bash betiği yaptım . Bir veya daha fazla dizin üzerinde kullanabilirsiniz - böylece bu yayındaki kodu sizin için yapabilir veya aynı anda birden fazla projede yapabilir.
#!/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/*
Creates a git project on Dropbox for every folder contained within the workspace directory, where the project name matches the folder name
HELP
exit 0
fi
# We have enough parameters, so let's actually do this thing.
START_DIR=$(pwd)
# Make sure we have a connection to Dropbox
cd ~
if [ -s 'Dropbox' ] ; then
echo "Found Dropbox directory."
cd Dropbox
if [ -s 'git' ] ; then
echo " Dropbox Git directory found."
else
echo " Dropbox Git directory created."
mkdir git
fi
else
echo "You do not have a Dropbox folder at ~/Dropbox! Install Dropbox. Aborting..."
exit 0
fi
# Process all directories matching the passed parameters.
echo "Starting processing for all files..."
for PROJ in $*
do
if [ -d $PROJ ] ; then
PROJNAME=$(basename $PROJ)
echo " Processing $PROJNAME..."
# Enable Git with this project.
cd $PROJ
if [ -s '.git' ] ; then
echo " $PROJNAME is already a Git repository, ignoring..."
else
echo " Initializing Git for $PROJNAME..."
git init -q
git add .
git commit -m "Initial creation of project." -q
# Make the origin Dropbox.
cd ~/Dropbox/git
if [ -s $PROJNAME ] ; then
echo " Warning! $PROJNAME already exists in Git! Ignoring..."
else
echo " Putting $PROJNAME project on Dropbox..."
mkdir $PROJNAME
cd $PROJNAME
git init -q --bare
fi
# Link the project to the origin
echo " Copying local $PROJNAME to Dropbox..."
cd $PROJ
git remote add origin "~/Dropbox/git/$PROJNAME"
git push -q origin master
git branch --set-upstream master origin/master
fi
fi
done
echo "Done processing all files."
cd $START_DIR
Git ve Dropbox'ı kullanmanın bir yol olduğunu düşünmüyorum ... Her ikisinin de özelliklerini düşünün:
Git:
Dropbox:
Bazı dosyalarınızı paylaşmaktan endişe ediyorsanız, neden onları şifrelemesiniz? Ve sonra Dropbox'ın Git'e, yani genel ve özel dosyalara sahip olmanın en büyük avantajını elde edebilirsiniz ...
Şimdi 2015 ve üç gün önce Dropbox'ta git'i güvenle kullanmak için Dropbox API v2 tabanlı yeni bir araç oluşturuldu. Masaüstü istemcisini kullanmak yerine API'ye karşı çalışır ve paylaşılan bir klasörde barındırılan bir depoya aynı anda birden çok push işlemi gerçekleştirir.
Yapılandırıldıktan sonra, diğer uzaktan kumandalar gibi bir git uzaktan kumandası kurulmasına izin verir.
git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"
Şifrelenmiş uzaktan yedeklemeler için Mercurial (veya Git) + TrueCrypt + Dropbox kullanıyorum .
En havalı şey, kodunuzun küçük bir bölümünü değiştirirseniz Dropbox'ın tüm TrueCrypt kapsayıcısını senkronize ETMEMEKTEDİR. Senkronizasyon süresi kabaca değişikliklerin miktarıyla orantılıdır. Şifrelenmiş olsa da, TrueCrypt + Dropbox kombinasyonu blok şifreleme + blok seviyesi senkronizasyonunun mükemmel kullanımını sağlar.
İkincisi, monolitik şifreli bir konteyner sadece güvenlik sağlamakla kalmaz, aynı zamanda depo bozulması olasılığını da azaltır .
Dikkat: Bununla birlikte, Dropbox çalışırken kabı monte etmemeye çok dikkat etmelisiniz. Ayrıca, 2 farklı müşteri konteynere farklı sürümleri iade ederse çatışmaları çözmek için bir acı olabilir. Bu nedenle, sadece bir kişi için yedekler için kullanan tek bir kişi için pratiktir.
Kurmak:
preserve modification timestamp
* işaretini kaldırın .Kullanımı:
PS preserve modification timestamp
Dropbox'ın işaretini kaldırmak dosyanın değiştirildiğini ve senkronize edilmesi gerektiğini bildirir. Kapsayıcıyı monte etmenin, içinde herhangi bir dosya değiştirmeseniz bile zaman damgasını değiştirdiğini unutmayın. Bunun olmasını istemiyorsanız, birimiread-only
Dan McNevin'in cevabını seviyorum! Git ve Dropbox'ı şimdi birlikte kullanıyorum ve iş akışım şöyle görünecek şekilde .bash_profile dosyamda birkaç takma ad kullanıyorum :
~/project $ git init
~/project $ git add .
~/project $ gcam "first commit"
~/project $ git-dropbox
Bunlar benim takma adım:
alias gcam='git commit -a -m'
alias gpom='git push origin master'
alias gra='git remote add origin'
alias git-dropbox='TMPGP=~/Dropbox/git/$(pwd | awk -F/ '\''{print $NF}'\'').git;mkdir -p $TMPGP && (cd $TMPGP; git init --bare) && gra $TMPGP && gpom'
Bu yöntemi (Dropbox'ta çıplak bir havuz oluşturmak) bir paylaşım klasöründe kullanırız .
Küçük bir geliştirici grubu, bu senkronize edilmiş depodan çekebilir ve yerel bir klon oluşturabilir. İş birimi tamamlandığında, başlangıç noktasına geri dönüyoruz.
Eksik olduğum şeylerden biri, kaynak gönderme işlemi gerçekleştikten sonra değişiklik kümesi bilgileriyle birlikte bir e-postanın gönderilmesinin iyi bir yoludur. Değişiklikleri manuel olarak takip etmek için Google Wave'i kullanıyoruz.
Mercurial'ı tavsiye edilen şekilde kullanıyorum ve özellikle makinelerin herhangi biri farklıysa dikkatli olmanızı öneriyorum. Dropbox forumları, kendiliğinden ortaya çıkan gizemli dosya adı dava sorunlarının şikayetleriyle doludur. Hg (ve Git'in varsayalım) rutin kontroller sırasında fark etmeyecek veya şikayet etmeyecek ve yolsuzluğu sadece gerçek bir şekilde kullanmaya çalıştığınızda bozuk bir repo şikayet ettiğinde duyacaksınız. Kötü haber. Sorun ve onun geçici çözümleri hakkında daha spesifik olabilir diliyorum; Ben hala bu karmaşayı kendim çıkarmaya çalışıyorum.
Ayrıca, depo yönetiminin tüm ayrıntılı ayrıntılarını bir avuç komutla (3-4) yapan açık kaynaklı bir proje (çapraz platform [Linux, Mac, Win] komut dosyaları koleksiyonu) vardır.
https://github.com/karalabe/gitbox/wiki
Örnek kullanım:
$ gitbox create myapp
Creating empty repository...
Initializing new repository...
Repository successfully created.
$ gitbox clone myapp
Cloning repository...
Repository successfully cloned.
Bundan sonra normal git kullanımı:
$ echo “Some change” > somefile.txt
$ git add somefile.txt
$ git commit –m “Created some file”
$ git push
Komut referansı ve öğreticiler için proje wiki ve kılavuzlarına bakın.
Github olmayan depolarımı Dropbox'ta saklıyorum. Karşılaştığım bir uyarı, yeniden yükleme işleminden sonra senkronize ediliyordu. Dropbox, büyük olanlara geçmeden önce en küçük dosyaları indirir. Geceleri başlar ve hafta sonu sonra geri gelirseniz sorun değil :-)
Konum - http://forums.dropbox.com/topic.php?id=29984&replies=6
2014'te Git ve Dropbox'ı yaklaşık bir buçuk yıldır sorunsuz bir şekilde kullanıyorum. Yine de bazı noktalar:
git push
uzak bir depoya iter, böylece bozulursa kolayca kurtarabilirim.C:\Users
olan mklink /D link target
bazı kütüphaneler mutlak konumlara işaret çünkü.Dan McNevin'in en çok oy alan cevabını seviyorum. Git komutları dizisini çok fazla kez bitirdim ve bir senaryo yapmaya karar verdim. İşte burada:
#!/bin/bash
# Usage
usage() {
echo "Usage: ${0} -m [ master-branch-directory ] -r [ remote-branch-directory ] [ project-name ]"
exit 1
}
# Defaults
defaults() {
masterdir="${HOME}/Dropbox/git"
remotedir="${PWD}"
gitignorefile="# OS generated files #\n\n.DS_Store\n.DS_Store?\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db"
}
# Check if no arguments
if [ ${#} -eq 0 ] ; then
echo "Error: No arguments specified"
usage
fi
#Set defaults
defaults
# Parse arguments
while [ ${#} -ge 1 ]; do
case "${1}" in
'-h' | '--help' ) usage ;;
'-m' )
shift
masterdir="${1}"
;;
'-r' )
shift
remotedir="${1}"
;;
* )
projectname="${1##*/}"
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}"
Komut dosyası yalnızca bir proje adı gerektirir. ~/Dropbox/git/
Belirtilen ad altında bir git deposu oluşturur ve geçerli dizinin tüm içeriğini yeni oluşturulan başlangıç ana dalına iletir. Birden fazla proje adı verilirse, en sağdaki proje adı bağımsız değişkeni kullanılır.
İsteğe bağlı olarak, -r komut argümanı, kaynak ana öğeye gönderilecek uzak dalı belirtir. Proje kökeni yöneticisinin konumu -m argümanı ile de belirtilebilir. Varsayılan bir .gitignore dosyası da uzak dal dizinine yerleştirilir. Dizin ve .gitignore dosya varsayılanları kodda belirtilir.
Başka bir yaklaşım:
Şimdiye kadar en popüler olan @Dan yanıtı da dahil olmak üzere tüm cevaplar , git github, bitbucket vb.
Ancak, orijinal soru "Git ve Dropbox'ı etkili bir şekilde birlikte kullanmanın" gerçekten ne anlama geldiğini belirtmediğinden, başka bir yaklaşım üzerinde çalışalım: "Yalnızca çalışma ağacını senkronize etmek için Dropbox'ı kullanma."
Nasıl yapılır şu adımları içerir:
Proje dizin içinde, tek bir boş oluşturur .git
(örneğin dizin mkdir -p myproject/.git
)
.git
Dropbox'ta dizinin senkronizasyonunu kaldırın. Dropbox Uygulaması kullanıyorsanız: Tercihler, Senkronizasyon ve .git
dizinin işaretinin kaldırılması gereken "senkronize edilecek klasörleri seçin" seçeneğine gidin . Bu, .git
dizini kaldıracaktır .
git init
proje dizininde çalıştır
.git
Zaten varsa da çalışır , o zaman sadece 2 adımını yapın. Dropbox, web sitesinde git dosyalarının bir kopyasını tutacaktır.
Adım 2, Dropbox'ın bu yaklaşım için istenen sonuç olan git sistem yapısını senkronize etmemesine neden olacaktır.
Neden bu yaklaşım kullanılır?
Henüz itilmemiş değişikliklerin bir Dropbox yedeği olacak ve cihazlar arasında senkronize edilecek.
Dropbox'ın cihazlar arasında senkronizasyon yaparken bir şeyleri vidalaması git status
ve git diff
işleri sıralamak için kullanışlı olması durumunda.
Dropbox hesabında yer tasarrufu sağlar (tüm geçmiş orada saklanmaz)
Bu Dan'in cevap @ yorumlarda @dubek ve @Ates dile getirdiği endişeleri ve içinde @clu tarafından kaygıları önler başka bir yanıt .
Başka bir yerde bir uzaktan kumandanın (github, vb.) Varlığı bu yaklaşımla iyi sonuç verecektir.
Farklı dallarda çalışmak, aşağıdakilerle ilgilenilmesi gereken bazı sorunlar getirir:
Potansiyel bir sorun, farklı kollara bakıldığında Dropbox'ın (gereksiz yere?) Potansiyel olarak birçok dosyayı senkronize etmesidir.
İki veya daha fazla Dropbox senkronize edilmiş cihazın farklı şubeleri işaretliyse, her iki cihazda da taahhüt edilmemiş değişiklikler kaybolabilir,
Bu sorunların bir yolu da git worktree
şube çıkışlarını ayrı dizinlerde tutmaktır.
xattr -w com.dropbox.ignored 1 /path/to/somewhere
.
Benim 2 sent için Dropbox sadece merkezi bir repo ana bilgisayar almak rahatsız istemiyorum kişisel kullanım için sence. Herhangi bir profesyonel gelişim için muhtemelen zaten iş parçacığında birkaç kez belirtildiği gibi çözeceğinizden daha fazla sorun yaratacaksınız, Dropbox bu kullanım durumu için tasarlanmamıştır. Bununla birlikte, herhangi bir üçüncü taraf eklentisi veya aracı olmadan Dropbox'ta depoları boşaltmak için mükemmel bir güvenli yöntem demetleri kullanmaktır. .gitconfig
Yazma kaydetmek için benim aşağıdaki takma adları var :
[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 #"
Misal:
# 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
Benzer bir sorunla karşılaştım ve aynı şey için küçük bir senaryo oluşturdum. Fikir, Git ile Dropbox'ı olabildiğince basit kullanmaktır. Şu anda, Ruby kodunu hızlı bir şekilde uyguladım ve yakında daha fazlasını ekleyeceğim.
Komut dosyasına adresinden erişilebilir https://github.com/nuttylabs/box-git
.
Üçüncü taraf entegrasyon araçlarını kullanmadan, durumu biraz geliştirebilir ve DropBox ve Git ile SpiderOak gibi diğer benzer bulut disk hizmetlerini kullanabilirim.
Amaç, kısmi bir durum yükleyebileceğinden ve daha sonra geri indirerek git durumunuzu tamamen bozacağından, bu dosya değişikliklerinin ortasında senkronizasyondan kaçınmaktır.
Bu sorunu önlemek için yaptım:
git bundle create my_repo.git --all
.Git durumunu tekrar karıştırmayacağının garantisi olmadığı için mükemmel değil, ama yardımcı oluyor ve şimdilik herhangi bir sorun alamadım.
MacOS'ta Dropbox'ı durdurabilir, değişikliklerinizi yapabilir ve ardından Dropbox'ı yeniden başlatabilirsiniz. Aşağıdaki kombinasyonu kullanıyorum ve bundan oldukça memnunum:
Her ikisinde de (yerel git yönetilen proje dizininiz ve Dropbox'ta bulunan uzak git deponuz) otomatik paketlemeyi devre dışı bırakmak için aşağıdaki komutu çalıştırın (dropbox senkronizasyonundaki ana sorun budur)
git config --global gc.auto 0
Ardından, zaman zaman dropbox devre dışı bırakıldığında depoları sıkıştırın. Örneğin, uygulamalarımın her yeni sürümünü aldığımda bash-build-script'imde aşağıdakileri yapıyorum.
osascript -e "tell application \"Dropbox\" to quit"
# Compress local
git gc --prune=now; git repack -a -d
# Compress remote
REPOS_DIR_REMOTE=`git remote get-url --push origin`
cd "${REPOS_DIR_REMOTE}"
git gc --prune=now; git repack -a -d
osascript -e "tell application \"Dropbox\" to launch"
osascript -e "display notification with title \"Compress Done\""