אני משתמש ב-git כבר לא מעט זמן. בבית עבור פרויקטים אישיים וסתם שמירת קונפיגורציות, בעבודה (הקודמת, עכשיו יש SVN)עבור פרויקטים שונים ומשונים. תמיד הייתי משתמש די ממוצא, בלי merges, branches וכו. את הגיבוי שלי שמרתי בצורת remote repository מבוסס SSH. תמיכה ב-http/s לא הייתה חשובה לי כל כך עד שהעברתי את השרת שלי ל-amazon, וגישת ssh נעשתה פחות נוחה. בנוסף, רציתי לאפשר גישה נוחה היכן שאין ssh.
עד לגרסה 1.6 של git, תמיכה ב-http הייתה מוגבלת, ונקראה dumb http. השימוש העיקרי שנעשה ב-remote repository היה מעל פרוטוקול native git או ssh. בגרסה 1.7 שופרה הגישה מעל http (ו-https), בעזרת cgi script שנקרא git-http-backend. תפקידו לספק גישה ל-repositories מקומיים(או מרוחקים, תלוי איך מסתכלים על זה).
כברירת מחדל, לא תהיה גישה כלל ל-repositories שלא מכילים את הקובץ "git-daemon-export-ok". ניתן להעביר את משתנה הסביבה GIT_HTTP_EXPORT_ALL לסקריפט בקונפיגורציה של שרת ה-web, ואז תהיה גישה לכל ה-repositories.
אז סביבת העבודה שלי מבוססת micro ec2 instance, debian ו-lighttpd. גישה ל-repository מאופשרת רק מעל https.
כדי להתקין את החבילות הנדרשות יש להריץ את הפקודה
apt-get install lighttpd git apache2-utils
להלן הקונפיגורציה הרלוונטית של lighttpd. טעינת המודולים הרלוונטיים
server.modules = ( "mod_setenv",
"mod_rewrite",
"mod_cgi" )
כדי לאפשר SSL. אני משתמש בתעודות של CACert
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/ssl/certs/server.crt"
ssl.ca-file = "/etc/ssl/certs/ca-chain.pem"
server.document-root = "/srv/www/"
החלק הבא מאפשר את הגישה ל-repository בעזרת git-http-backend. שימו לב למשתנה GIT_HTTP_EXPORT_ALL, הוא יאפשר גישה לכל ה-repositories. במידה ורוצים לחשוף רק את חלקם, יש להוריד אותו.
alias.url += ( "/git" => "/usr/lib/git-core/git-http-backend")
url.rewrite-once = ( "^/git$" => "/git/" )
$HTTP["url"] =~ "^/git" {
cgi.assign = ( "" => "" )
setenv.add-environment = (
"GIT_PROJECT_ROOT" => "/srv/git",
"GIT_HTTP_EXPORT_ALL" => ""
)
}
}
יש לדאוג שהספריה שבה ישבו ה-git repositories תהיה בבעלות המשתמש אשר מריץ את lighttpd. המקרה שלי, זהו www-data
chown -R www-data.www-data /srv/git
כברירת מחדל, ה-repositories יהיה לקריאה בלבד, כדי לאפשר כתיבה, מאלץ אותנו git-http-backend להזדהות מול השרת. בחרתי להשתמש ב digest, כדי לא לשמור על הדיסק ולשלוח סיסמא שהיא לא hashed.
server.modules += ( "mod_auth" )
auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd.user"
auth.require = ( "/git" =>
(
"method" => "digest",
"realm" => "git",
"require" => "valid-user"
)
)
כדי לצור את הקובץ lighttpd.user, השתמשתי בפקודה htdigest
htdigest -c /etc/lighttpd/lighttpd.user git myusername
עכשיו ניתן למשוך repository מהשרת, ולבצע push אליו כדי לסנכרן שינויים.
$ git clone https://myserver.com/git/myrepo
Cloning into myrepo...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
$ cd myrepo
$ touch newfile
$ git add newfile
$ git commit -m "added new file"
[master 161d975] added new file
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 newfile
$ git push
Username:
Password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 214 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To https://myserver.com/git/myrepo
161d975..6040789 master -> master
במידה ורוצים לשמור את שם המשתמש וססמה, כך שלא נתבקש להזין אותו בכל push, ניתן לצור את הקובץ ~/.netrc אשר יכיל שם שרת, משתמש וססמה בצורה הבאה:
machine myserver.com login myusername password mypassword
כמובן, לא לשכוח לשנות את ההרשאות של הקובץ .netrc כך שיהיה קריא רק ע"י המשתמש שלכם
chmod 600 ~/.netrc
לא הכי אלגנטי בעולם. שמירת ססמה, בקובץ, בצורה לא מוצפנת זה לא להיט, אבל עושה את העבודה. למי שלא מוכן להתפשר על הנושא, אתם קוראים את הפוסט הלא נכון, חפשו אחד על git מעל SSH (תמצאו אותו כנראה בעתיד הקרוב בבלוג הזה)
זה כל מה נדרש. כעת אפשר לעבור מול ה-repository כמו היה git native או ssh.