Jawaban:
Saya pikir Git di Dropbox hebat. Saya menggunakannya sepanjang waktu. Saya memiliki beberapa komputer (dua di rumah dan satu di tempat kerja) yang saya gunakan Dropbox sebagai repositori telanjang pusat. Karena saya tidak ingin meng-host-nya di layanan publik, dan saya tidak memiliki akses ke server yang selalu bisa saya ssh, Dropbox menangani ini dengan menyinkronkan (sangat cepat) di latar belakang.
Setup adalah sesuatu seperti ini:
~/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
Dari sana, Anda dapat mengkloning ~/Dropbox/git/project.git
yang telah dikaitkan dengan akun Dropbox Anda (atau telah berbagi direktori ini dengan orang-orang), Anda dapat melakukan semua operasi Git normal dan mereka akan disinkronkan ke semua mesin lain secara otomatis.
Saya menulis posting blog, Pada Kontrol Versi , ( tautan lama mati ) pada alasan saya dan bagaimana saya mengatur lingkungan saya, itu didasarkan pada pengalaman pengembangan Ruby on Rails saya , tetapi dapat diterapkan pada apa saja, sungguh.
Cara yang tepat untuk melakukan ini adalah menggunakan git-remote-dropbox: https://github.com/anishathalye/git-remote-dropbox
Membuat repo kosong Anda sendiri di Dropbox menyebabkan banyak masalah. Anish (pencipta perpustakaan) menjelaskan yang terbaik :
Penyebab utama masalah ini adalah bahwa klien desktop Dropbox dirancang untuk menyinkronkan file, bukan repositori Git. Tanpa penanganan khusus untuk repositori Git, ia tidak mempertahankan jaminan yang sama seperti Git. Operasi pada repositori jarak jauh tidak lagi bersifat atomik, dan operasi bersamaan atau pengaturan waktu yang tidak beruntung dengan sinkronisasi dapat menghasilkan repositori yang rusak.
Remote Git tradisional menjalankan kode di sisi server untuk membuat ini berfungsi dengan baik, tetapi kami tidak dapat melakukannya.
Solusi: Dimungkinkan untuk menyelesaikan ini dengan benar. Adalah mungkin untuk menggunakan Git dengan Dropbox dan memiliki jaminan keamanan dan konsistensi yang sama dengan remote Git tradisional, bahkan ketika ada banyak pengguna dan operasi bersamaan!
Untuk seorang pengguna, ini sesederhana menggunakan git-remote-dropbox, sebuah bantuan jarak jauh Git yang bertindak sebagai jembatan dua arah transparan antara Git dan Dropbox dan mempertahankan semua jaminan dari remote Git tradisional. Bahkan aman untuk digunakan dengan folder bersama, sehingga dapat digunakan untuk kolaborasi (yay repo pribadi tak terbatas dengan kolaborator tak terbatas!).
Dengan bantuan jarak jauh, dimungkinkan untuk menggunakan Dropbox sebagai remote Git dan terus menggunakan semua perintah Git biasa seperti git clone, git pull, dan git push, dan semuanya akan berjalan seperti yang diharapkan.
Jawaban ini didasarkan pada Mercurial pengalaman , bukan Git, tetapi pengalaman ini mengatakan menggunakan Dropbox dengan cara ini meminta repositori yang korup jika bahkan ada kemungkinan Anda akan memperbarui repositori berbasis Dropbox yang sama dari mesin yang berbeda di berbagai waktu (Mac, Unix, Windows dalam kasus saya).
Saya tidak memiliki daftar lengkap tentang hal-hal yang dapat salah, tetapi inilah contoh spesifik yang menggigit saya. Setiap mesin memiliki gagasan sendiri tentang karakter akhir baris dan bagaimana karakter huruf besar / kecil ditangani dalam nama file. Dropbox dan Git / Mercurial menangani ini sedikit berbeda (saya tidak ingat perbedaan persisnya). Jika Dropbox memperbarui repositori di belakang repositori Git / Mercurial, presto, broken. Ini terjadi segera dan tidak terlihat, sehingga Anda bahkan tidak tahu repositori Anda rusak sampai Anda mencoba memulihkan sesuatu darinya.
Setelah menggali dari satu kekacauan melakukan hal-hal seperti ini, saya telah menggunakan resep berikut ini dengan sukses besar dan tidak ada tanda-tanda masalah. Cukup pindahkan repositori Anda dari Dropbox. Gunakan Dropbox untuk yang lainnya; dokumentasi, file JAR , apa pun yang Anda suka. Dan gunakan GitHub (Git) atau Bitbucket (Mercurial) untuk mengelola repositori itu sendiri. Keduanya gratis sehingga ini tidak menambah biaya, dan masing-masing alat sekarang memainkan kekuatannya.
Menjalankan Git / Mercurial di atas Dropbox tidak menambah apa pun kecuali risiko. Jangan lakukan itu.
Terkait dengan tim kecil yang menggunakan Dropbox:
Jika setiap pengembang memiliki repositori kosong yang bisa ditulisi di Dropbox, yang hanya menarik pengembang lain, maka ini memfasilitasi pembagian kode tanpa risiko korupsi!
Kemudian jika Anda ingin 'arus utama' terpusat, Anda dapat meminta satu pengembang mengelola semua dorongan dari repo mereka sendiri.
Saya tidak ingin meletakkan semua proyek saya di bawah satu repositori Git, saya juga tidak ingin masuk dan menjalankan kode ini untuk setiap proyek tunggal, jadi saya membuat skrip Bash yang akan mengotomatiskan proses. Anda dapat menggunakannya pada satu atau beberapa direktori - sehingga dapat melakukan kode dalam posting ini untuk Anda atau dapat melakukannya pada beberapa proyek sekaligus.
#!/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
Saya tidak berpikir bahwa menggunakan Git dan Dropbox adalah cara untuk pergi ... Pikirkan saja fitur-fiturnya dari keduanya:
Git:
Dropbox:
Dan jika Anda khawatir berbagi beberapa file Anda, mengapa tidak mengartikannya? Dan kemudian Anda bisa mendapatkan keuntungan terbesar dari Dropbox untuk Git, yaitu memiliki file publik dan pribadi ...
Sekarang tahun 2015, dan pada tiga hari yang lalu, alat baru berdasarkan Dropbox API v2 telah dibuat untuk menggunakan git di Dropbox dengan aman. Ini bekerja melawan API daripada menggunakan klien desktop, dan dengan benar menangani beberapa dorongan simultan ke repositori yang dihosting di folder bersama.
Setelah dikonfigurasi, ini memungkinkan seseorang untuk mengatur git remote persis seperti git remote lainnya.
git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"
Saya menggunakan Mercurial (atau Git) + TrueCrypt + Dropbox untuk cadangan jarak jauh terenkripsi .
Yang paling keren adalah Dropbox TIDAK menyinkronkan seluruh wadah TrueCrypt jika Anda memodifikasi sebagian kecil kode Anda. Waktu sinkronisasi kira-kira sebanding dengan jumlah perubahan. Meskipun dienkripsi, kombinasi TrueCrypt + Dropbox membuat penggunaan blok cipher + sinkronisasi tingkat blok menjadi sangat baik.
Kedua, wadah terenkripsi monolitik tidak hanya menambah keamanan, tetapi juga mengurangi kemungkinan korupsi penyimpanan .
Perhatian: Namun Anda harus sangat berhati-hati untuk tidak memasang wadah saat Dropbox berjalan. Bisa juga menyusahkan untuk menyelesaikan konflik jika 2 klien berbeda check-in versi yang berbeda ke wadah. Jadi, praktis hanya untuk satu orang yang menggunakannya untuk cadangan, bukan untuk tim.
Mendirikan:
preserve modification timestamp
*.Pemakaian:
PS Hapus centang pada preserve modification timestamp
dropbox yang memberitahu bahwa file telah dimodifikasi dan harus disinkronkan. Perhatikan bahwa pemasangan wadah memodifikasi stempel waktu meskipun Anda tidak mengubah file apa pun di dalamnya. Jika Anda tidak ingin itu terjadi, cukup pasang volume asread-only
Saya suka jawabannya oleh Dan McNevin! Saya menggunakan Git dan Dropbox bersama sekarang juga, dan saya menggunakan beberapa alias di .bash_profile saya sehingga alur kerja saya terlihat seperti ini:
~/project $ git init
~/project $ git add .
~/project $ gcam "first commit"
~/project $ git-dropbox
Ini adalah alias saya:
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'
Kami menggunakan metode ini (membuat repositori telanjang di Dropbox) pada folder berbagi .
Sekelompok kecil pengembang dapat menarik dari repositori kosong yang disinkronkan dan membuat klon lokal. Setelah unit kerja selesai, kami mendorong kembali ke asal.
Satu hal yang saya lewatkan adalah cara yang baik untuk mengirim e-mail dengan informasi perubahan-set begitu dorongan ke asal terjadi. Kami menggunakan Google Wave untuk melacak perubahan secara manual.
Saya telah menggunakan Mercurial dengan cara yang disarankan dan mendesak Anda untuk berhati-hati, terutama jika ada mesin yang berbeda. Forum Dropbox penuh dengan keluhan masalah nama file misterius yang muncul secara spontan. Hg (dan saya kira Git) tidak akan melihat atau mengeluh selama checkin rutin dan Anda hanya akan mendengar tentang korupsi ketika mengeluhkan repo yang korup ketika Anda mencoba menggunakannya secara nyata. Kabar buruk. Seandainya saya bisa lebih spesifik tentang masalah dan penyelesaiannya; Saya masih mencoba menggali dari kekacauan ini sendiri.
Ada juga proyek open source (kumpulan skrip [Linux, Mac, Win] lintas platform) yang melakukan semua rincian rumit dari manajemen repositori dengan sejumlah (3-4) perintah.
https://github.com/karalabe/gitbox/wiki
Penggunaan sampel adalah:
$ gitbox create myapp
Creating empty repository...
Initializing new repository...
Repository successfully created.
$ gitbox clone myapp
Cloning repository...
Repository successfully cloned.
Setelah itu penggunaan normal git:
$ echo “Some change” > somefile.txt
$ git add somefile.txt
$ git commit –m “Created some file”
$ git push
Periksa wiki proyek dan manual untuk referensi perintah lengkap dan tutorial.
Saya menyimpan repo non-Github saya di Dropbox. Satu peringatan yang saya temui adalah menyinkronkan setelah menginstal ulang. Dropbox akan mengunduh file terkecil terlebih dahulu sebelum pindah ke yang lebih besar. Tidak masalah jika Anda mulai di malam hari dan kembali setelah akhir pekan :-)
Utas saya - http://forums.dropbox.com/topic.php?id=29984&replies=6
Sekarang pada tahun 2014, saya telah menggunakan Git dan Dropbox selama sekitar satu setengah tahun tanpa masalah. Beberapa poin:
git push
mendorong ke repositori jarak jauh, sehingga jika pernah rusak, saya dapat dengan mudah memulihkannya.C:\Users
dengan mklink /D link target
karena beberapa perpustakaan diarahkan ke lokasi absolut.Saya suka jawaban terpilih oleh Dan McNevin. Saya akhirnya melakukan urutan perintah git terlalu banyak dan memutuskan untuk membuat skrip. Jadi begini:
#!/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}"
Script hanya membutuhkan nama proyek. Ini akan menghasilkan repositori git di ~/Dropbox/git/
bawah nama yang ditentukan dan akan mendorong seluruh isi direktori saat ini ke cabang master asal yang baru dibuat. Jika lebih dari satu nama proyek diberikan, argumen nama proyek paling kanan akan digunakan.
Secara opsional, argumen perintah -r menentukan cabang jarak jauh yang akan mendorong ke master asal. Lokasi master asal proyek juga dapat ditentukan dengan argumen -m. File .gitignore default juga ditempatkan di direktori cabang jauh. Default file direktori dan .gitignore ditentukan dalam skrip.
Pendekatan lain:
Semua jawaban sejauh ini, termasuk jawaban @Dan yang paling populer, membahas gagasan menggunakan Dropbox untuk memusatkan repositori bersama alih-alih menggunakan layanan yang berfokus pada git seperti github, bitbucket, dll.
Tetapi, karena pertanyaan awal tidak secara spesifik menjelaskan arti dari menggunakan "Git dan Dropbox secara efektif", mari kita bekerja dengan pendekatan lain: "Menggunakan Dropbox untuk menyinkronkan hanya worktree."
Cara memiliki langkah-langkah ini:
di dalam direktori proyek, satu menciptakan .git
direktori kosong (misalnya mkdir -p myproject/.git
)
batalkan sinkronisasi .git
direktori di Dropbox. Jika menggunakan Aplikasi Dropbox: buka Preferensi, Sinkronisasi, dan "pilih folder yang akan disinkronkan", di mana .git
direktori tersebut harus tidak ditandai. Ini akan menghapus .git
direktori.
jalankan git init
di direktori proyek
Ini juga berfungsi jika .git
sudah ada, maka hanya lakukan langkah 2. Dropbox akan menyimpan salinan file git di situs web.
Langkah 2 akan menyebabkan Dropbox tidak menyinkronkan struktur sistem git, yang merupakan hasil yang diinginkan untuk pendekatan ini.
Mengapa seseorang menggunakan pendekatan ini?
Perubahan yang belum didorong akan memiliki cadangan Dropbox, dan akan disinkronkan di seluruh perangkat.
Jika Dropbox mengacaukan sesuatu saat menyinkronkan antar perangkat, git status
dan git diff
akan mudah untuk menyelesaikannya.
Ini menghemat ruang di akun Dropbox (seluruh riwayat tidak akan disimpan di sana)
Ini menghindari kekhawatiran yang diangkat oleh @dubek dan @Ates dalam komentar pada jawaban @ Dan, dan kekhawatiran oleh @clu pada jawaban lain .
Keberadaan remote di tempat lain (github, dll.) Akan berfungsi dengan baik dengan pendekatan ini.
Bekerja di cabang yang berbeda membawa beberapa masalah, yang perlu dijaga:
Salah satu masalah potensial adalah memiliki Dropbox (yang tidak perlu?) Menyinkronkan banyak file secara potensial ketika seseorang memeriksa cabang yang berbeda.
Jika dua atau lebih perangkat Dropbox yang disinkronkan memiliki cabang yang berbeda diperiksa, perubahan yang tidak dilakukan untuk kedua perangkat dapat hilang,
Salah satu cara mengatasi masalah ini adalah dengan menggunakan git worktree
untuk menjaga checkout cabang di direktori yang terpisah.
xattr -w com.dropbox.ignored 1 /path/to/somewhere
,.
Untuk 2 sen saya, Dropbox hanya masuk akal untuk penggunaan pribadi di mana Anda tidak ingin repot-repot mendapatkan host repo pusat. Untuk pengembangan profesional apa pun Anda mungkin akan menciptakan lebih banyak masalah daripada yang akan Anda selesaikan, seperti yang telah disebutkan beberapa kali di utas, Dropbox tidak dirancang untuk kasus penggunaan ini. Yang mengatakan, metode yang sangat aman untuk membuang repositori di Dropbox tanpa plugin atau alat pihak ketiga adalah dengan menggunakan bundel. Saya memiliki alias berikut .gitconfig
untuk menghemat pengetikan:
[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 #"
Contoh:
# 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
Saya telah menghadapi masalah yang sama dan telah membuat skrip kecil untuk hal yang sama. Idenya adalah menggunakan Dropbox dengan Git sesederhana mungkin. Saat ini, saya telah dengan cepat mengimplementasikan kode Ruby , dan saya akan segera menambahkan lebih banyak.
Script dapat diakses di https://github.com/nuttylabs/box-git
.
Tanpa menggunakan alat integrasi pihak ketiga, saya bisa sedikit meningkatkan kondisinya dan menggunakan DropBox dan layanan cloud disk serupa lainnya seperti SpiderOak dengan Git.
Tujuannya adalah untuk menghindari sinkronisasi di tengah-tengah modifikasi file-file ini, karena dapat mengunggah status parsial dan kemudian akan mengunduhnya kembali, benar-benar merusak kondisi git Anda.
Untuk menghindari masalah ini, saya melakukan:
git bundle create my_repo.git --all
.Ini tidak sempurna karena tidak ada jaminan itu tidak akan mengacaukan negara git lagi, tetapi itu membantu dan untuk saat ini saya tidak mendapatkan masalah.
Di MacOS Anda juga dapat menghentikan Dropbox, melakukan perubahan, lalu meluncurkan kembali Dropbox. Saya menggunakan kombinasi berikut dan cukup senang dengan itu:
Di keduanya (direktori proyek yang dikelola git lokal dan repositori git jarak jauh Anda yang terletak di Dropbox) jalankan perintah berikut untuk menonaktifkan pengemasan otomatis (yang merupakan masalah utama dengan sinkronisasi dropbox)
git config --global gc.auto 0
Kemudian dari waktu ke waktu, kompres repositori dengan dropbox dinonaktifkan. Misalnya saya melakukan hal berikut dalam skrip bash-build-saya setiap kali saya membuat rilis baru dari aplikasi saya.
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\""