initial import from rails to sinatra

This commit is contained in:
Scott Chacon 2011-09-21 11:08:34 -07:00
Коммит ff69cc5b2d
69 изменённых файлов: 4777 добавлений и 0 удалений

2
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,2 @@
local.db
.bundle

20
Gemfile Normal file
Просмотреть файл

@ -0,0 +1,20 @@
source "http://rubygems.org"
gem "sinatra"
gem "dm-core"
gem "dm-serializer"
gem "dm-migrations"
gem "dm-validations"
gem "dm-timestamps"
group :production do
gem "pg"
gem "dm-postgres-adapter"
end
group :development do
gem "sqlite3-ruby"
gem "dm-sqlite-adapter"
gem "shotgun"
end

60
Gemfile.lock Normal file
Просмотреть файл

@ -0,0 +1,60 @@
GEM
remote: http://rubygems.org/
specs:
addressable (2.2.6)
data_objects (0.10.6)
addressable (~> 2.1)
dm-core (1.1.0)
addressable (~> 2.2.4)
dm-do-adapter (1.1.0)
data_objects (~> 0.10.2)
dm-core (~> 1.1.0)
dm-migrations (1.1.0)
dm-core (~> 1.1.0)
dm-postgres-adapter (1.1.0)
dm-do-adapter (~> 1.1.0)
do_postgres (~> 0.10.2)
dm-serializer (1.1.0)
dm-core (~> 1.1.0)
fastercsv (~> 1.5.4)
json (~> 1.4.6)
dm-sqlite-adapter (1.1.0)
dm-do-adapter (~> 1.1.0)
do_sqlite3 (~> 0.10.2)
dm-timestamps (1.1.0)
dm-core (~> 1.1.0)
dm-validations (1.1.0)
dm-core (~> 1.1.0)
do_postgres (0.10.6)
data_objects (= 0.10.6)
do_sqlite3 (0.10.6)
data_objects (= 0.10.6)
fastercsv (1.5.4)
json (1.4.6)
pg (0.11.0)
rack (1.3.3)
shotgun (0.9)
rack (>= 1.0)
sinatra (1.2.6)
rack (~> 1.1)
tilt (>= 1.2.2, < 2.0)
sqlite3 (1.3.4)
sqlite3-ruby (1.3.3)
sqlite3 (>= 1.3.3)
tilt (1.3.3)
PLATFORMS
ruby
DEPENDENCIES
dm-core
dm-migrations
dm-postgres-adapter
dm-serializer
dm-sqlite-adapter
dm-timestamps
dm-validations
pg
shotgun
sinatra
sqlite3-ruby

46
app.rb Normal file
Просмотреть файл

@ -0,0 +1,46 @@
require 'sinatra'
require 'dm-core'
require 'dm-serializer/to_json'
require 'dm-migrations'
require 'dm-validations'
require 'dm-timestamps'
## -- DATABASE STUFF --
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/local.db")
class Version
include DataMapper::Resource
property :version, String
property :current, Boolean, :key => true
property :created_at, DateTime
end
DataMapper.auto_upgrade!
class GitApp < Sinatra::Base
def get_version
@version = '1.7.6.1'
@date = "2011-08-24"
end
get '/' do
get_version
erb :index
end
get '/course/:action' do
@action = params[:action]
@action.gsub!('.html', '')
erb :"#{@action}", :layout => :course
end
get '/:action' do
@action = params[:action]
get_version if @action == 'download'
erb :"#{@action}"
end
end

12
config.ru Normal file
Просмотреть файл

@ -0,0 +1,12 @@
require "rubygems"
require "bundler"
Bundler.setup
Bundler.require(:runtime)
require './app'
use Rack::Static, :urls => ["/css", "/images", "/js"], :root => "public"
run GitApp

30
public/404.html Normal file
Просмотреть файл

@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>The page you were looking for doesn't exist (404)</title>
<style type="text/css">
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
div.dialog {
width: 25em;
padding: 0 4em;
margin: 4em auto 0 auto;
border: 1px solid #ccc;
border-right-color: #999;
border-bottom-color: #999;
}
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
</style>
</head>
<body>
<!-- This file lives in public/404.html -->
<div class="dialog">
<h1>The page you were looking for doesn't exist.</h1>
<p>You may have mistyped the address or the page may have moved.</p>
</div>
</body>
</html>

30
public/422.html Normal file
Просмотреть файл

@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>The change you wanted was rejected (422)</title>
<style type="text/css">
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
div.dialog {
width: 25em;
padding: 0 4em;
margin: 4em auto 0 auto;
border: 1px solid #ccc;
border-right-color: #999;
border-bottom-color: #999;
}
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
</style>
</head>
<body>
<!-- This file lives in public/422.html -->
<div class="dialog">
<h1>The change you wanted was rejected.</h1>
<p>Maybe you tried to change something you didn't have access to.</p>
</div>
</body>
</html>

30
public/500.html Normal file
Просмотреть файл

@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>We're sorry, but something went wrong (500)</title>
<style type="text/css">
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
div.dialog {
width: 25em;
padding: 0 4em;
margin: 4em auto 0 auto;
border: 1px solid #ccc;
border-right-color: #999;
border-bottom-color: #999;
}
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
</style>
</head>
<body>
<!-- This file lives in public/500.html -->
<div class="dialog">
<h1>We're sorry, but something went wrong.</h1>
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
</div>
</body>
</html>

22
public/blueprint/ie.css Normal file
Просмотреть файл

@ -0,0 +1,22 @@
/* -----------------------------------------------------------------------
Blueprint CSS Framework 0.7.1
http://blueprintcss.googlecode.com
* Copyright (c) 2007-2008. See LICENSE for more info.
* See README for instructions on how to use Blueprint.
* For credits and origins, see AUTHORS.
* This is a compressed file. See the sources in the 'src' directory.
----------------------------------------------------------------------- */
/* ie.css */
body {text-align:center;}
.container {text-align:left;}
* html .column {overflow-x:hidden;}
* html legend {margin:-18px -8px 16px 0;padding:0;}
ol {margin-left:2em;}
sup {vertical-align:text-top;}
sub {vertical-align:text-bottom;}
html>body p code {*white-space:normal;}
hr {margin:-8px auto 11px;}

Просмотреть файл

@ -0,0 +1,14 @@
Fancy Type
* Gives you classes to use if you'd like some
extra fancy typography.
Credits and instructions are specified above each class
in the fancy-type.css file in this directory.
Usage
----------------------------------------------------------------
1) Add this plugin to lib/settings.yml.
See compress.rb for instructions.

Просмотреть файл

@ -0,0 +1,71 @@
/* --------------------------------------------------------------
fancy-type.css
* Lots of pretty advanced classes for manipulating text.
See the Readme file in this folder for additional instructions.
-------------------------------------------------------------- */
/* Indentation instead of line shifts for sibling paragraphs. */
p + p { text-indent:2em; margin-top:-1.5em; }
form p + p { text-indent: 0; } /* Don't want this in forms. */
/* For great looking type, use this code instead of asdf:
<span class="alt">asdf</span>
Best used on prepositions and ampersands. */
.alt {
color: #666;
font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif;
font-style: italic;
font-weight: normal;
}
/* For great looking quote marks in titles, replace "asdf" with:
<span class="dquo">&#8220;</span>asdf&#8221;
(That is, when the title starts with a quote mark).
(You may have to change this value depending on your font size). */
.dquo { margin-left: -.5em; }
/* Reduced size type with incremental leading
(http://www.markboulton.co.uk/journal/comments/incremental_leading/)
This could be used for side notes. For smaller type, you don't necessarily want to
follow the 1.5x vertical rhythm -- the line-height is too much.
Using this class, it reduces your font size and line-height so that for
every four lines of normal sized type, there is five lines of the sidenote. eg:
New type size in em's:
10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems)
New line-height value:
12px x 1.5 = 18px (old line-height)
18px x 4 = 72px
72px / 5 = 14.4px (new line height)
14.4px / 10px = 1.44 (new line height in em's) */
p.incr, .incr p {
font-size: 10px;
line-height: 1.44em;
margin-bottom: 1.5em;
}
/* Surround uppercase words and abbreviations with this class.
Based on work by Jørgen Arnor Gårdsø Lom [http://twistedintellect.com/] */
.caps {
font-variant: small-caps;
letter-spacing: 1px;
text-transform: lowercase;
font-size:1.2em;
line-height:1%;
font-weight:bold;
padding:0 2px;
}

Просмотреть файл

@ -0,0 +1,29 @@
/* -----------------------------------------------------------------------
Blueprint CSS Framework 0.7.1
http://blueprintcss.googlecode.com
* Copyright (c) 2007-2008. See LICENSE for more info.
* See README for instructions on how to use Blueprint.
* For credits and origins, see AUTHORS.
* This is a compressed file. See the sources in the 'src' directory.
----------------------------------------------------------------------- */
/* print.css */
body {line-height:1.5;font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;color:#000;background:none;font-size:10pt;}
.container {background:none;}
hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;}
hr.space {background:#fff;color:#fff;}
h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;}
code {font:.9em "Courier New", Monaco, Courier, monospace;}
img {float:left;margin:1.5em 1.5em 1.5em 0;}
a img {border:none;}
p img.top {margin-top:0;}
blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;}
.small {font-size:.9em;}
.large {font-size:1.1em;}
.quiet {color:#999;}
.hide {display:none;}
a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;}
a:link:after, a:visited:after {content:" (" attr(href) ") ";font-size:90%;}

225
public/blueprint/screen.css Executable file
Просмотреть файл

@ -0,0 +1,225 @@
/*
BLUEPRINT CSS
* Filename: compressed.css
* Version: 0.7.1 (2008-02-25) YYYY-MM-DD
* Website: http://code.google.com/p/blueprintcss/
Generated by:
* Blueprint CSS Grid Generator (2008-07-22) [http://kematzy.com/blueprint-generator/]
== STRUCTURE: ========================
* Page width: 788 px
* Number of columns: 21
* Column width: 28 px
* Margin width: 10 px
======================================
*/
/* reset.css */
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
body {line-height:1.5;}
table {border-collapse:separate;border-spacing:0;}
caption, th, td {text-align:left;font-weight:normal;}
table, td, th {vertical-align:middle;}
blockquote:before, blockquote:after, q:before, q:after {content:"";}
blockquote, q {quotes:"" "";}
a img {border:none;}
/* typography.css */
body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;}
h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
h2 {font-size:2em;margin-bottom:0.75em;}
h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;height:1.25em;}
h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
h6 {font-size:1em;font-weight:bold;}
h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
p {margin:0 0 1.5em;}
p img {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;}
p img.right {float:right;margin:1.5em 0 1.5em 1.5em;}
a:focus, a:hover {color:#000;}
a {color:#009;text-decoration:underline;}
blockquote {margin:1.5em;color:#666;font-style:italic;}
strong {font-weight:bold;}
em, dfn {font-style:italic;}
dfn {font-weight:bold;}
sup, sub {line-height:0;}
abbr, acronym {border-bottom:1px dotted #666;}
address {margin:0 0 1.5em;font-style:italic;}
del {color:#666;}
pre, code {margin:1.5em 0;white-space:pre;}
pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
li ul, li ol {margin:0 1.5em;}
ul, ol {margin:0 1.5em 1.5em 1.5em;}
ul {list-style-type:disc;}
ol {list-style-type:decimal;}
dl {margin:0 0 1.5em 0;}
dl dt {font-weight:bold;}
dd {margin-left:1.5em;}
table {margin-bottom:1.4em;width:100%;}
th {font-weight:bold;background:#C3D9FF;}
th, td {padding:4px 10px 4px 5px;}
tr.even td {background:#E5ECF9;}
tfoot {font-style:italic;}
caption {background:#eee;}
.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
.hide {display:none;}
.quiet {color:#666;}
.loud {color:#000;}
.highlight {background:#ff0;}
.added {background:#060;color:#fff;}
.removed {background:#900;color:#fff;}
.first {margin-left:0;padding-left:0;}
.last {margin-right:0;padding-right:0;}
.top {margin-top:0;padding-top:0;}
.bottom {margin-bottom:0;padding-bottom:0;}
/* grid.css */
.container {width:788px;margin:0 auto;}
.showgrid {background:url(src/grid.png);}
body {margin:1.5em 0;}
div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21 {float:left;margin-right: 10px;}
div.last {margin-right:0;}
.span-1 { width: 28px;}
.span-2 { width: 66px;}
.span-3 { width: 104px;}
.span-4 { width: 142px;}
.span-5 { width: 180px;}
.span-6 { width: 218px;}
.span-7 { width: 256px;}
.span-8 { width: 294px;}
.span-9 { width: 332px;}
.span-10 { width: 370px;}
.span-11 { width: 408px;}
.span-12 { width: 446px;}
.span-13 { width: 484px;}
.span-14 { width: 522px;}
.span-15 { width: 560px;}
.span-16 { width: 598px;}
.span-17 { width: 636px;}
.span-18 { width: 674px;}
.span-19 { width: 712px;}
.span-20 { width: 750px;}
.span-21, div.span-21 { width: 788px; margin: 0; }
.append-1 { padding-right: 38px;}
.append-2 { padding-right: 76px;}
.append-3 { padding-right: 114px;}
.append-4 { padding-right: 152px;}
.append-5 { padding-right: 190px;}
.append-6 { padding-right: 228px;}
.append-7 { padding-right: 266px;}
.append-8 { padding-right: 304px;}
.append-9 { padding-right: 342px;}
.append-10 { padding-right: 380px;}
.append-11 { padding-right: 418px;}
.append-12 { padding-right: 456px;}
.append-13 { padding-right: 494px;}
.append-14 { padding-right: 532px;}
.append-15 { padding-right: 570px;}
.append-16 { padding-right: 608px;}
.append-17 { padding-right: 646px;}
.append-18 { padding-right: 684px;}
.append-19 { padding-right: 722px;}
.append-20 { padding-right: 760px;}
.prepend-1 { padding-left: 38px;}
.prepend-2 { padding-left: 76px;}
.prepend-3 { padding-left: 114px;}
.prepend-4 { padding-left: 152px;}
.prepend-5 { padding-left: 190px;}
.prepend-6 { padding-left: 228px;}
.prepend-7 { padding-left: 266px;}
.prepend-8 { padding-left: 304px;}
.prepend-9 { padding-left: 342px;}
.prepend-10 { padding-left: 380px;}
.prepend-11 { padding-left: 418px;}
.prepend-12 { padding-left: 456px;}
.prepend-13 { padding-left: 494px;}
.prepend-14 { padding-left: 532px;}
.prepend-15 { padding-left: 570px;}
.prepend-16 { padding-left: 608px;}
.prepend-17 { padding-left: 646px;}
.prepend-18 { padding-left: 684px;}
.prepend-19 { padding-left: 722px;}
.prepend-20 { padding-left: 760px;}
div.border{padding-right:4px;margin-right:5px;border-right:1px solid #eee;}
div.colborder { padding-right:24px;margin-right:23px;border-right:1px solid #eee;}
.pull-1 { margin-left: -38px;}
.pull-2 { margin-left: -76px;}
.pull-3 { margin-left: -114px;}
.pull-4 { margin-left: -152px;}
.pull-5 { margin-left: -190px;}
.pull-6 { margin-left: -228px;}
.pull-7 { margin-left: -266px;}
.pull-8 { margin-left: -304px;}
.pull-9 { margin-left: -342px;}
.pull-10 { margin-left: -380px;}
.pull-11 { margin-left: -418px;}
.pull-12 { margin-left: -456px;}
.pull-13 { margin-left: -494px;}
.pull-14 { margin-left: -532px;}
.pull-15 { margin-left: -570px;}
.pull-16 { margin-left: -608px;}
.pull-17 { margin-left: -646px;}
.pull-18 { margin-left: -684px;}
.pull-19 { margin-left: -722px;}
.pull-20 { margin-left: -760px;}
.pull-21 { margin-left: -798px;}
.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21 {float:left;position:relative;}
.push-1 { margin: 0 -38px 1.5em 38px;}
.push-2 { margin: 0 -76px 1.5em 76px;}
.push-3 { margin: 0 -114px 1.5em 114px;}
.push-4 { margin: 0 -152px 1.5em 152px;}
.push-5 { margin: 0 -190px 1.5em 190px;}
.push-6 { margin: 0 -228px 1.5em 228px;}
.push-7 { margin: 0 -266px 1.5em 266px;}
.push-8 { margin: 0 -304px 1.5em 304px;}
.push-9 { margin: 0 -342px 1.5em 342px;}
.push-10 { margin: 0 -380px 1.5em 380px;}
.push-11 { margin: 0 -418px 1.5em 418px;}
.push-12 { margin: 0 -456px 1.5em 456px;}
.push-13 { margin: 0 -494px 1.5em 494px;}
.push-14 { margin: 0 -532px 1.5em 532px;}
.push-15 { margin: 0 -570px 1.5em 570px;}
.push-16 { margin: 0 -608px 1.5em 608px;}
.push-17 { margin: 0 -646px 1.5em 646px;}
.push-18 { margin: 0 -684px 1.5em 684px;}
.push-19 { margin: 0 -722px 1.5em 722px;}
.push-20 { margin: 0 -760px 1.5em 760px;}
.push-21 { margin: 0 -798px 1.5em 798px;}
.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21 {float:right;position:relative;}
.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;}
hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
hr.space {background:#fff;color:#fff;}
.clearfix:after, .container:after {content:".";display:block;height:0;clear:both;visibility:hidden;}
.clearfix, .container {display:inline-block;}
* html .clearfix, * html .container {height:1%;}
.clearfix, .container {display:block;}
.clear {clear:both;}
/* forms.css */
label {font-weight:bold;}
fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
legend {font-weight:bold;font-size:1.2em;}
input.text, input.title, textarea, select {margin:0.5em 0;border:1px solid #bbb;}
input.text:focus, input.title:focus, textarea:focus, select:focus {border:1px solid #666;}
input.text, input.title {width:300px;padding:5px;}
input.title {font-size:1.5em;}
textarea {width:390px;height:250px;padding:5px;}
.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
.success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
.error a {color:#8a1f11;}
.notice a {color:#514721;}
.success a {color:#264409;}

Просмотреть файл

@ -0,0 +1,49 @@
/* --------------------------------------------------------------
forms.css
* Sets up some default styling for forms
* Gives you classes to enhance your forms
Usage:
* For text fields, use class .title or .text
-------------------------------------------------------------- */
label { font-weight: bold; }
fieldset { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
legend { font-weight: bold; font-size:1.2em; }
/* Form fields
-------------------------------------------------------------- */
input.text, input.title,
textarea, select {
margin:0.5em 0;
border:1px solid #bbb;
}
input.text:focus, input.title:focus,
textarea:focus, select:focus {
border:1px solid #666;
}
input.text,
input.title { width: 300px; padding:5px; }
input.title { font-size:1.5em; }
textarea { width: 390px; height: 250px; padding:5px; }
/* Success, notice and error boxes
-------------------------------------------------------------- */
.error,
.notice,
.success { padding: .8em; margin-bottom: 1em; border: 2px solid #ddd; }
.error { background: #FBE3E4; color: #8a1f11; border-color: #FBC2C4; }
.notice { background: #FFF6BF; color: #514721; border-color: #FFD324; }
.success { background: #E6EFC2; color: #264409; border-color: #C6D880; }
.error a { color: #8a1f11; }
.notice a { color: #514721; }
.success a { color: #264409; }

250
public/blueprint/src/grid.css Executable file
Просмотреть файл

@ -0,0 +1,250 @@
/* --------------------------------------------------------------
BLUEPRINT CSS
* Filename: grid.css
* Version: 0.7.1 (2008-02-25) YYYY-MM-DD
* Website: http://code.google.com/p/blueprintcss/
Generated by:
* Blueprint CSS Grid Generator (2008-07-23) [http://kematzy.com/blueprint-generator/]
Based on work by:
* Olav Bjorkoy [bjorkoy.com]
* Nathan Borror [playgroundblues.com]
* Jeff Croft [jeffcroft.com]
* Christian Metts [mintchaos.com]
* Khoi Vinh [subtraction.com]
== STRUCTURE: ========================
* Page width: 788 px
* Number of columns: 21
* Column width: 28 px
* Margin width: 10 px
======================================
By default, the grid is 788px wide, with 21 columns
spanning 28px, and a 10px margin between columns.
If you need fewer or more columns, use this formula to calculate
the new total width:
Total width = (number_of_columns * column_width) - margin_width
Read more about using a grid here:
* subtraction.com/archives/2007/0318_oh_yeeaahh.php
-------------------------------------------------------------- */
/* A container should group all your columns. */
.container {
width: 788px;
margin: 0 auto;
}
/* Use this class on any div.span / container to see the grid. */
.showgrid {
background: url(src/grid.png);
}
/* Body margin for a sensile default look. */
body {
margin:1.5em 0;
}
/* Columns
-------------------------------------------------------------- */
/* Sets up basic grid floating and margin. */
div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21 {float:left;margin-right: 10px;}
/* The last column in a row needs this class. */
div.last { margin-right: 0; }
/* Use these classes to set the width of a column. */
.span-1 { width: 28px;}
.span-2 { width: 66px;}
.span-3 { width: 104px;}
.span-4 { width: 142px;}
.span-5 { width: 180px;}
.span-6 { width: 218px;}
.span-7 { width: 256px;}
.span-8 { width: 294px;}
.span-9 { width: 332px;}
.span-10 { width: 370px;}
.span-11 { width: 408px;}
.span-12 { width: 446px;}
.span-13 { width: 484px;}
.span-14 { width: 522px;}
.span-15 { width: 560px;}
.span-16 { width: 598px;}
.span-17 { width: 636px;}
.span-18 { width: 674px;}
.span-19 { width: 712px;}
.span-20 { width: 750px;}
.span-21, div.span-21 { width: 788px; margin: 0; }
/* Add these to a column to append empty cols. */
.append-1 { padding-right: 38px;}
.append-2 { padding-right: 76px;}
.append-3 { padding-right: 114px;}
.append-4 { padding-right: 152px;}
.append-5 { padding-right: 190px;}
.append-6 { padding-right: 228px;}
.append-7 { padding-right: 266px;}
.append-8 { padding-right: 304px;}
.append-9 { padding-right: 342px;}
.append-10 { padding-right: 380px;}
.append-11 { padding-right: 418px;}
.append-12 { padding-right: 456px;}
.append-13 { padding-right: 494px;}
.append-14 { padding-right: 532px;}
.append-15 { padding-right: 570px;}
.append-16 { padding-right: 608px;}
.append-17 { padding-right: 646px;}
.append-18 { padding-right: 684px;}
.append-19 { padding-right: 722px;}
.append-20 { padding-right: 760px;}
/* Add these to a column to prepend empty cols. */
.prepend-1 { padding-left: 38px;}
.prepend-2 { padding-left: 76px;}
.prepend-3 { padding-left: 114px;}
.prepend-4 { padding-left: 152px;}
.prepend-5 { padding-left: 190px;}
.prepend-6 { padding-left: 228px;}
.prepend-7 { padding-left: 266px;}
.prepend-8 { padding-left: 304px;}
.prepend-9 { padding-left: 342px;}
.prepend-10 { padding-left: 380px;}
.prepend-11 { padding-left: 418px;}
.prepend-12 { padding-left: 456px;}
.prepend-13 { padding-left: 494px;}
.prepend-14 { padding-left: 532px;}
.prepend-15 { padding-left: 570px;}
.prepend-16 { padding-left: 608px;}
.prepend-17 { padding-left: 646px;}
.prepend-18 { padding-left: 684px;}
.prepend-19 { padding-left: 722px;}
.prepend-20 { padding-left: 760px;}
/* Border on right hand side of a column. */
div.border {
padding-right:4px;
margin-right:5px;
border-right: 1px solid #eee;
}
/* Border with more whitespace, spans one column. */
div.colborder {
padding-right:26px;
margin-right:23px;
border-right: 1px solid #eee;
}
/* Use these classes on an element to push it into the
next column, or to pull it into the previous column. */
.pull-1 { margin-left: -38px;}
.pull-2 { margin-left: -76px;}
.pull-3 { margin-left: -114px;}
.pull-4 { margin-left: -152px;}
.pull-5 { margin-left: -190px;}
.pull-6 { margin-left: -228px;}
.pull-7 { margin-left: -266px;}
.pull-8 { margin-left: -304px;}
.pull-9 { margin-left: -342px;}
.pull-10 { margin-left: -380px;}
.pull-11 { margin-left: -418px;}
.pull-12 { margin-left: -456px;}
.pull-13 { margin-left: -494px;}
.pull-14 { margin-left: -532px;}
.pull-15 { margin-left: -570px;}
.pull-16 { margin-left: -608px;}
.pull-17 { margin-left: -646px;}
.pull-18 { margin-left: -684px;}
.pull-19 { margin-left: -722px;}
.pull-20 { margin-left: -760px;}
.pull-21 { margin-left: -798px;}
.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21 {float:left;position:relative;}
.push-1 { margin: 0 -38px 1.5em 38px;}
.push-2 { margin: 0 -76px 1.5em 76px;}
.push-3 { margin: 0 -114px 1.5em 114px;}
.push-4 { margin: 0 -152px 1.5em 152px;}
.push-5 { margin: 0 -190px 1.5em 190px;}
.push-6 { margin: 0 -228px 1.5em 228px;}
.push-7 { margin: 0 -266px 1.5em 266px;}
.push-8 { margin: 0 -304px 1.5em 304px;}
.push-9 { margin: 0 -342px 1.5em 342px;}
.push-10 { margin: 0 -380px 1.5em 380px;}
.push-11 { margin: 0 -418px 1.5em 418px;}
.push-12 { margin: 0 -456px 1.5em 456px;}
.push-13 { margin: 0 -494px 1.5em 494px;}
.push-14 { margin: 0 -532px 1.5em 532px;}
.push-15 { margin: 0 -570px 1.5em 570px;}
.push-16 { margin: 0 -608px 1.5em 608px;}
.push-17 { margin: 0 -646px 1.5em 646px;}
.push-18 { margin: 0 -684px 1.5em 684px;}
.push-19 { margin: 0 -722px 1.5em 722px;}
.push-20 { margin: 0 -760px 1.5em 760px;}
.push-21 { margin: 0 -798px 1.5em 798px;}
.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21 {float:right;position:relative;}
/* Misc classes and elements
-------------------------------------------------------------- */
/* Use a .box to create a padded box inside a column. */
.box {
padding: 1.5em;
margin-bottom: 1.5em;
background: #E5ECF9;
}
/* Use this to create a horizontal ruler across a column. */
hr {
background: #ddd;
color: #ddd;
clear: both;
float: none;
width: 100%;
height: .1em;
margin: 0 0 1.45em;
border: none;
}
hr.space {
background: #fff;
color: #fff;
}
/* Clearing floats without extra markup
Based on How To Clear Floats Without Structural Markup by PiE
[http://www.positioniseverything.net/easyclearing.html] */
.clearfix:after, .container:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix, .container {display: inline-block;}
* html .clearfix,
* html .container {height: 1%;}
.clearfix, .container {display: block;}
/* Regular clearing
apply to column that should drop below previous ones. */
.clear { clear:both; }

Двоичные данные
public/blueprint/src/grid.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 98 B

Просмотреть файл

@ -0,0 +1,35 @@
/* --------------------------------------------------------------
ie.css
Contains every hack for Internet Explorer,
so that our core files stay sweet and nimble.
-------------------------------------------------------------- */
/* Make sure the layout is centered in IE5 */
body { text-align: center; }
.container { text-align: left; }
/* Fixes IE margin bugs */
* html .column { overflow-x: hidden; }
/* Elements
-------------------------------------------------------------- */
/* Fixes incorrect styling of legend in IE6. */
* html legend { margin:-18px -8px 16px 0; padding:0; }
/* Fixes incorrect placement of ol numbers in IE6/7. */
ol { margin-left:2em; }
/* Fixes wrong line-height on sup/sub in IE. */
sup { vertical-align: text-top; }
sub { vertical-align: text-bottom; }
/* Fixes IE7 missing wrapping of code elements. */
html>body p code { *white-space: normal; }
/* IE 6&7 has problems with setting proper <hr> margins. */
hr { margin: -8px auto 11px; }

85
public/blueprint/src/print.css Executable file
Просмотреть файл

@ -0,0 +1,85 @@
/* --------------------------------------------------------------
print.css
* Gives you some sensible styles for printing pages.
* See Readme file in this directory for further instructions.
Some additions you'll want to make, customized to your markup:
#header, #footer, #navigation { display:none; }
-------------------------------------------------------------- */
body {
line-height: 1.5;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
color:#000;
background: none;
font-size: 10pt;
}
/* Layout
-------------------------------------------------------------- */
.container {
background: none;
}
hr {
background:#ccc;
color:#ccc;
width:100%;
height:2px;
margin:2em 0;
padding:0;
border:none;
}
hr.space {
background: #fff;
color: #fff;
}
/* Text
-------------------------------------------------------------- */
h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; }
code { font:.9em "Courier New", Monaco, Courier, monospace; }
img { float:left; margin:1.5em 1.5em 1.5em 0; }
a img { border:none; }
p img.top { margin-top: 0; }
blockquote {
margin:1.5em;
padding:1em;
font-style:italic;
font-size:.9em;
}
.small { font-size: .9em; }
.large { font-size: 1.1em; }
.quiet { color: #999; }
.hide { display:none; }
/* Links
-------------------------------------------------------------- */
a:link, a:visited {
background: transparent;
font-weight:700;
text-decoration: underline;
}
a:link:after, a:visited:after {
content: " (" attr(href) ") ";
font-size: 90%;
}
/* If you're having trouble printing relative links, uncomment and customize this:
(note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */
/* a[href^="/"]:after {
content: " (http://www.yourdomain.com" attr(href) ") ";
} */

38
public/blueprint/src/reset.css Executable file
Просмотреть файл

@ -0,0 +1,38 @@
/* --------------------------------------------------------------
reset.css
* Resets default browser CSS.
-------------------------------------------------------------- */
html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, code,
del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
}
body {
line-height: 1.5;
}
/* Tables still need 'cellspacing="0"' in the markup. */
table { border-collapse: separate; border-spacing: 0; }
caption, th, td { text-align: left; font-weight: normal; }
table, td, th { vertical-align: middle; }
/* Remove possible quote marks (") from <q>, <blockquote>. */
blockquote:before, blockquote:after, q:before, q:after { content: ""; }
blockquote, q { quotes: "" ""; }
/* Remove annoying border on linked images. */
a img { border: none; }

Просмотреть файл

@ -0,0 +1,104 @@
/* --------------------------------------------------------------
typography.css
* Sets up some sensible default typography.
-------------------------------------------------------------- */
/* Default font settings.
The font-size percentage is of 16px. (0.75 * 16px = 12px) */
body {
font-size: 75%;
color: #222;
background: #fff;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
/* Headings
-------------------------------------------------------------- */
h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; }
h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
h2 { font-size: 2em; margin-bottom: 0.75em; }
h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; height: 1.25em; }
h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
h6 { font-size: 1em; font-weight: bold; }
h1 img, h2 img, h3 img,
h4 img, h5 img, h6 img {
margin: 0;
}
/* Text elements
-------------------------------------------------------------- */
p { margin: 0 0 1.5em; }
p img { float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
p img.right { float: right; margin: 1.5em 0 1.5em 1.5em; }
a:focus,
a:hover { color: #000; }
a { color: #009; text-decoration: underline; }
blockquote { margin: 1.5em; color: #666; font-style: italic; }
strong { font-weight: bold; }
em,dfn { font-style: italic; }
dfn { font-weight: bold; }
sup, sub { line-height: 0; }
abbr,
acronym { border-bottom: 1px dotted #666; }
address { margin: 0 0 1.5em; font-style: italic; }
del { color:#666; }
pre,code { margin: 1.5em 0; white-space: pre; }
pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
/* Lists
-------------------------------------------------------------- */
li ul,
li ol { margin:0 1.5em; }
ul, ol { margin: 0 1.5em 1.5em 1.5em; }
ul { list-style-type: disc; }
ol { list-style-type: decimal; }
dl { margin: 0 0 1.5em 0; }
dl dt { font-weight: bold; }
dd { margin-left: 1.5em;}
/* Tables
-------------------------------------------------------------- */
table { margin-bottom: 1.4em; width:100%; }
th { font-weight: bold; background: #C3D9FF; }
th,td { padding: 4px 10px 4px 5px; }
tr.even td { background: #E5ECF9; }
tfoot { font-style: italic; }
caption { background: #eee; }
/* Misc classes
-------------------------------------------------------------- */
.small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
.hide { display: none; }
.quiet { color: #666; }
.loud { color: #000; }
.highlight { background:#ff0; }
.added { background:#060; color: #fff; }
.removed { background:#900; color: #fff; }
.first { margin-left:0; padding-left:0; }
.last { margin-right:0; padding-right:0; }
.top { margin-top:0; padding-top:0; }
.bottom { margin-bottom:0; padding-bottom:0; }

10
public/dispatch.cgi Executable file
Просмотреть файл

@ -0,0 +1,10 @@
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
require "dispatcher"
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
Dispatcher.dispatch

24
public/dispatch.fcgi Executable file
Просмотреть файл

@ -0,0 +1,24 @@
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
#
# You may specify the path to the FastCGI crash log (a log of unhandled
# exceptions which forced the FastCGI instance to exit, great for debugging)
# and the number of requests to process before running garbage collection.
#
# By default, the FastCGI crash log is RAILS_ROOT/log/fastcgi.crash.log
# and the GC period is nil (turned off). A reasonable number of requests
# could range from 10-100 depending on the memory footprint of your app.
#
# Example:
# # Default log path, normal GC behavior.
# RailsFCGIHandler.process!
#
# # Default log path, 50 requests between GC.
# RailsFCGIHandler.process! nil, 50
#
# # Custom log path, normal GC behavior.
# RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log'
#
require File.dirname(__FILE__) + "/../config/environment"
require 'fcgi_handler'
RailsFCGIHandler.process!

10
public/dispatch.rb Executable file
Просмотреть файл

@ -0,0 +1,10 @@
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
require "dispatcher"
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
Dispatcher.dispatch

0
public/favicon.ico Normal file
Просмотреть файл

Двоичные данные
public/favicon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 164 B

1232
public/gitserver.txt Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу

542
public/http-protocol.txt Normal file
Просмотреть файл

@ -0,0 +1,542 @@
HTTP transfer protocols
=======================
Git supports two HTTP based transfer protocols. A "dumb" protocol
which requires only a standard HTTP server on the server end of the
connection, and a "smart" protocol which requires a Git aware CGI
(or server module). This document describes both protocols.
As a design feature smart clients can automatically upgrade "dumb"
protocol URLs to smart URLs. This permits all users to have the
same published URL, and the peers automatically select the most
efficient transport available to them.
URL Format
----------
URLs for Git repositories accessed by HTTP use the standard HTTP
URL syntax documented by RFC 1738, so they are of the form:
http://<host>:<port>/<path>
Within this documentation the placeholder $GIT_URL will stand for
the http:// repository URL entered by the end-user.
Both the "smart" and "dumb" HTTP protocols used by Git operate
by appending additional path components onto the end of the user
supplied $GIT_URL string.
Clients MUST strip a trailing '/', if present, from the user supplied
$GIT_URL string to prevent empty path tokens ('//') from appearing
in any URL sent to a server. Compatible clients must expand
'$GIT_URL/info/refs' as 'foo/info/refs' and not 'foo//info/refs'.
Authentication
--------------
Standard HTTP authentication is used if authentication is required
to access a repository, and MAY be configured and enforced by the
HTTP server software.
Because Git repositories are accessed by standard path components
server administrators MAY use directory based permissions within
their HTTP server to control repository access.
Clients SHOULD support Basic authentication as described by RFC 2616.
Servers SHOULD support Basic authentication by relying upon the
HTTP server placed in front of the Git server software.
Servers MUST NOT require HTTP cookies for the purposes of
authentication or access control.
Clients and servers MAY support other common forms of HTTP based
authentication, such as Digest authentication.
SSL
---
Clients and servers SHOULD support SSL, particularly to protect
passwords when relying on Basic HTTP authentication.
Session State
-------------
The Git over HTTP protocol (much like HTTP itself) is stateless
from the perspective of the HTTP server side. All state must be
retained and managed by the client process. This permits simple
round-robin load-balancing on the server side, without needing to
worry about state mangement.
Clients MUST NOT require state management on the server side in
order to function correctly.
Servers MUST NOT require HTTP cookies in order to function correctly.
Clients MAY store and forward HTTP cookies during request processing
as described by RFC 2616 (HTTP/1.1). Servers SHOULD ignore any
cookies sent by a client.
pkt-line Format
---------------
Much (but not all) of the payload is described around pkt-lines.
A pkt-line is a variable length binary string. The first four bytes
of the line indicates the total length of the line, in hexadecimal.
The total length includes the 4 bytes used to denote the length.
A line SHOULD BE terminated by an LF, which if present MUST be
included in the total length.
A pkt-line MAY contain binary data, so implementors MUST ensure all
pkt-line parsing/formatting routines are 8-bit clean. The maximum
length of a pkt-line's data is 65532 bytes (65536 - 4).
Examples (as C-style strings):
pkt-line actual value
---------------------------------
"0006a\n" "a\n"
"0005a" "a"
"000bfoobar\n" "foobar\n"
"0004" ""
A pkt-line with a length of 0 ("0000") is a special case and MUST
be treated as a message break or terminator in the payload.
General Request Processing
--------------------------
Except where noted, all standard HTTP behavior SHOULD be assumed
by both client and server. This includes (but is not necessarily
limited to):
If there is no repository at $GIT_URL, the server MUST respond with
the '404 Not Found' HTTP status code.
If there is a repository at $GIT_URL, but access is not currently
permitted, the server MUST respond with the '403 Forbidden' HTTP
status code.
Servers SHOULD support both HTTP 1.0 and HTTP 1.1.
Servers SHOULD support chunked encoding for both
request and response bodies.
Clients SHOULD support both HTTP 1.0 and HTTP 1.1.
Clients SHOULD support chunked encoding for both
request and response bodies.
Servers MAY return ETag and/or Last-Modified headers.
Clients MAY revalidate cached entities by including If-Modified-Since
and/or If-None-Match request headers.
Servers MAY return '304 Not Modified' if the relevant headers appear
in the request and the entity has not changed. Clients MUST treat
'304 Not Modified' identical to '200 OK' by reusing the cached entity.
Clients MAY reuse a cached entity without revalidation if the
Cache-Control and/or Expires header permits caching. Clients and
servers MUST follow RFC 2616 for cache controls.
Discovering References
----------------------
All HTTP clients MUST begin either a fetch or a push exchange by
discovering the references available on the remote repository.
Dumb Clients
~~~~~~~~~~~~
HTTP clients that only support the "dumb" protocol MUST discover
references by making a request for the special info/refs file of
the repository.
Dumb HTTP clients MUST NOT include search/query parameters when
fetching the info/refs file. (That is, '?' must not appear in the
requested URL.)
C: GET $GIT_URL/info/refs HTTP/1.0
S: 200 OK
S:
S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint
S: d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master
S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
The Content-Type of the returned info/refs entity SHOULD be
"text/plain; charset=utf-8", but MAY be any content type.
Clients MUST NOT attempt to validate the returned Content-Type.
Dumb servers MUST NOT return a return type starting with
"application/x-git-".
Cache-Control headers MAY be returned to disable caching of the
returned entity.
When examining the response clients SHOULD only examine the HTTP
status code. Valid responses are '200 OK', or '304 Not Modified'.
The returned content is a UNIX formatted text file describing
each ref and its known value. The file SHOULD be sorted by name
according to the C locale ordering. The file SHOULD NOT include
the default ref named 'HEAD'.
info_refs = *( ref_record )
ref_record = any_ref | peeled_ref
any_ref = id HT name LF
peeled_ref = id HT name LF
id HT name "^{}" LF
id = 40*HEX
HEX = "0".."9" | "a".."f"
LF = <US-ASCII LF, linefeed (10)>
HT = <US-ASCII HT, horizontal-tab (9)>
Smart Clients
~~~~~~~~~~~~~
HTTP clients that support the "smart" protocol (or both the
"smart" and "dumb" protocols) MUST discover references by making
a paramterized request for the info/refs file of the repository.
The request MUST contain exactly one query parameter,
'service=$servicename', where $servicename MUST be the service
name the client wishes to contact to complete the operation.
The request MUST NOT contain additional query parameters.
C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
dumb server reply:
S: 200 OK
S:
S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint
S: d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master
S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
smart server reply:
S: 200 OK
S: Content-Type: application/x-git-upload-pack-advertisement
S: Cache-Control: no-cache
S:
S: ....# service=git-upload-pack
S: ....95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint\0 multi_ack
S: ....d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master
S: ....2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
S: ....a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
Dumb Server Response
^^^^^^^^^^^^^^^^^^^^
Dumb servers MUST respond with the dumb server reply format.
See the prior section under dumb clients for a more detailed
description of the dumb server response.
Smart Server Response
^^^^^^^^^^^^^^^^^^^^^
Smart servers MUST respond with the smart server reply format.
If the server does not recognize the requested service name, or the
requested service name has been disabled by the server administrator,
the server MUST respond with the '403 Forbidden' HTTP status code.
Cache-Control headers SHOULD be used to disable caching of the
returned entity.
The Content-Type MUST be 'application/x-$servicename-advertisement'.
Clients SHOULD fall back to the dumb protocol if another content
type is returned. When falling back to the dumb protocol clients
SHOULD NOT make an additional request to $GIT_URL/info/refs, but
instead SHOULD use the response already in hand. Clients MUST NOT
continue if they do not support the dumb protocol.
Clients MUST validate the status code is either '200 OK' or
'304 Not Modified'.
Clients MUST validate the first five bytes of the response entity
matches the regex "^[0-9a-f]{4}#". If this test fails, clients
MUST NOT continue.
Clients MUST parse the entire response as a sequence of pkt-line
records.
Clients MUST verify the first pkt-line is "# service=$servicename".
Servers MUST set $servicename to be the request parameter value.
Servers SHOULD include an LF at the end of this line.
Clients MUST ignore an LF at the end of the line.
Servers MUST terminate the response with the magic "0000" end
pkt-line marker.
The returned response is a pkt-line stream describing each ref and
its known value. The stream SHOULD be sorted by name according to
the C locale ordering. The stream SHOULD include the default ref
named 'HEAD' as the first ref. The stream MUST include capability
declarations behind a NUL on the first ref.
smart_reply = PKT-LINE("# service=$servicename" LF)
ref_list
"0000"
ref_list = empty_list | populated_list
empty_list = PKT-LINE(id SP "capabilities^{}" NUL cap_list LF)
non_empty_list = PKT-LINE(id SP name NUL cap_list LF)
*ref_record
cap_list = *(SP capability) SP
ref_record = any_ref | peeled_ref
any_ref = PKT-LINE(id SP name LF)
peeled_ref = PKT-LINE(id SP name LF)
PKT-LINE(id SP name "^{}" LF
id = 40*HEX
HEX = "0".."9" | "a".."f"
NL = <US-ASCII NUL, null (0)>
LF = <US-ASCII LF, linefeed (10)>
SP = <US-ASCII SP, horizontal-tab (9)>
Smart Service git-upload-pack
------------------------------
This service reads from the remote repository.
Clients MUST first perform ref discovery with
'$GIT_URL/info/refs?service=git-upload-pack'.
C: POST $GIT_URL/git-upload-pack HTTP/1.0
C: Content-Type: application/x-git-upload-pack-request
C:
C: ....want 0a53e9ddeaddad63ad106860237bbf53411d11a7
C: ....have 441b40d833fdfa93eb2908e52742248faf0ee993
C: 0000
S: 200 OK
S: Content-Type: application/x-git-upload-pack-result
S: Cache-Control: no-cache
S:
S: ....ACK %s, continue
S: ....NAK
Clients MUST NOT reuse or revalidate a cached reponse.
Servers MUST include sufficient Cache-Control headers
to prevent caching of the response.
Servers SHOULD support all capabilities defined here.
Clients MUST send at least one 'want' command in the request body.
Clients MUST NOT reference an id in a 'want' command which did not
appear in the response obtained through ref discovery.
compute_request = want_list
have_list
request_end
request_end = "0000" | "done"
want_list = PKT-LINE(want NUL cap_list LF)
*(want_pkt)
want_pkt = PKT-LINE(want LF)
want = "want" SP id
cap_list = *(SP capability) SP
have_list = *PKT-LINE("have" SP id LF)
command = create | delete | update
create = 40*"0" SP new_id SP name
delete = old_id SP 40*"0" SP name
update = old_id SP new_id SP name
TODO: Document this further.
TODO: Don't use uppercase for variable names below.
Capability include-tag
~~~~~~~~~~~~~~~~~~~~~~
When packing an object that an annotated tag points at, include the
tag object too. Clients can request this if they want to fetch
tags, but don't know which tags they will need until after they
receive the branch data. By enabling include-tag an entire call
to upload-pack can be avoided.
Capability thin-pack
~~~~~~~~~~~~~~~~~~~~
When packing a deltified object the base is not included if the base
is reachable from an object listed in the COMMON set by the client.
This reduces the bandwidth required to transfer, but it does slightly
increase processing time for the client to save the pack to disk.
The Negotiation Algorithm
~~~~~~~~~~~~~~~~~~~~~~~~~
The computation to select the minimal pack proceeds as follows
(c = client, s = server):
init step:
(c) Use ref discovery to obtain the advertised refs.
(c) Place any object seen into set ADVERTISED.
(c) Build an empty set, COMMON, to hold the objects that are later
determined to be on both ends.
(c) Build a set, WANT, of the objects from ADVERTISED the client
wants to fetch, based on what it saw during ref discovery.
(c) Start a queue, C_PENDING, ordered by commit time (popping newest
first). Add all client refs. When a commit is popped from
the queue its parents should be automatically inserted back.
Commits MUST only enter the queue once.
one compute step:
(c) Send one $GIT_URL/git-upload-pack request:
C: 0032want <WANT #1>...............................
C: 0032want <WANT #2>...............................
....
C: 0032have <COMMON #1>.............................
C: 0032have <COMMON #2>.............................
....
C: 0032have <HAVE #1>...............................
C: 0032have <HAVE #2>...............................
....
C: 0000
The stream is organized into "commands", with each command
appearing by itself in a pkt-line. Within a command line
the text leading up to the first space is the command name,
and the remainder of the line to the first LF is the value.
Command lines are terminated with an LF as the last byte of
the pkt-line value.
Commands MUST appear in the following order, if they appear
at all in the request stream:
* want
* have
The stream is terminated by a pkt-line flush ("0000").
A single "want" or "have" command MUST have one hex formatted
SHA-1 as its value. Multiple SHA-1s MUST be sent by sending
multiple commands.
The HAVE list is created by popping the first 32 commits
from C_PENDING. Less can be supplied if C_PENDING empties.
If the client has sent 256 HAVE commits and has not yet
received one of those back from S_COMMON, or the client has
emptied C_PENDING it should include a "done" command to let
the server know it won't proceed:
C: 0009done
(s) Parse the git-upload-pack request:
Verify all objects in WANT are directly reachable from refs.
The server MAY walk backwards through history or through
the reflog to permit slightly stale requests.
If no WANT objects are received, send an error:
TODO: Define error if no want lines are requested.
If any WANT object is not reachable, send an error:
TODO: Define error if an invalid want is requested.
Create an empty list, S_COMMON.
If 'have' was sent:
Loop through the objects in the order supplied by the client.
For each object, if the server has the object reachable from
a ref, add it to S_COMMON. If a commit is added to S_COMMON,
do not add any ancestors, even if they also appear in HAVE.
(s) Send the git-upload-pack response:
If the server has found a closed set of objects to pack or the
request ends with "done", it replies with the pack.
TODO: Document the pack based response
S: PACK...
The returned stream is the side-band-64k protocol supported
by the git-upload-pack service, and the pack is embedded into
stream 1. Progress messages from the server side may appear
in stream 2.
Here a "closed set of objects" is defined to have at least
one path from every WANT to at least one COMMON object.
If the server needs more information, it replies with a
status continue response:
TODO: Document the non-pack response
(c) Parse the upload-pack response:
TODO: Document parsing response
Do another compute step.
Smart Service git-receive-pack
------------------------------
This service modifies the remote repository.
Clients MUST first perform ref discovery with
'$GIT_URL/info/refs?service=git-receive-pack'.
C: POST $GIT_URL/git-receive-pack HTTP/1.0
C: Content-Type: application/x-git-receive-pack-request
C:
C: ....0a53e9ddeaddad63ad106860237bbf53411d11a7 441b40d833fdfa93eb2908e52742248faf0ee993 refs/heads/maint\0 report-status
C: 0000
C: PACK....
S: 200 OK
S: Content-Type: application/x-git-receive-pack-result
S: Cache-Control: no-cache
S:
S: ....
Clients MUST NOT reuse or revalidate a cached reponse.
Servers MUST include sufficient Cache-Control headers
to prevent caching of the response.
Servers SHOULD support all capabilities defined here.
Clients MUST send at least one command in the request body.
Within the command portion of the request body clients SHOULD send
the id obtained through ref discovery as old_id.
update_request = command_list
"PACK" <binary data>
command_list = PKT-LINE(command NUL cap_list LF)
*(command_pkt)
command_pkt = PKT-LINE(command LF)
cap_list = *(SP capability) SP
command = create | delete | update
create = 40*"0" SP new_id SP name
delete = old_id SP 40*"0" SP name
update = old_id SP new_id SP name
TODO: Document this further.
References
----------
link:http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)]
link:http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1]

Двоичные данные
public/images/book.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 593 B

Двоичные данные
public/images/books/gitbook-cover.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
public/images/books/pg_git.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
public/images/books/progit.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 9.5 KiB

Двоичные данные
public/images/books/pvc_git.gif Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
public/images/books/vcw_git.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.1 KiB

Двоичные данные
public/images/chacon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 24 KiB

Двоичные данные
public/images/chaconbig.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 99 KiB

Двоичные данные
public/images/git-logo.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 275 B

Двоичные данные
public/images/github.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.1 KiB

Двоичные данные
public/images/header.gif Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 26 KiB

Двоичные данные
public/images/header.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 76 KiB

Двоичные данные
public/images/osx_big.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.4 KiB

Двоичные данные
public/images/rails.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.5 KiB

Двоичные данные
public/images/tar.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.4 KiB

Двоичные данные
public/images/tux_big.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.2 KiB

Двоичные данные
public/images/ubuntu_big.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.7 KiB

Двоичные данные
public/images/videos/git-rs.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 26 KiB

Двоичные данные
public/images/videos/gitcasts.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 33 KiB

Двоичные данные
public/images/videos/vid-linus.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 27 KiB

Двоичные данные
public/images/videos/vid-ogre.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 27 KiB

Двоичные данные
public/images/windows_big.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.4 KiB

Двоичные данные
public/images/zip.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.3 KiB

Просмотреть файл

@ -0,0 +1,2 @@
// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

32
public/javascripts/jquery-1.2.6.min.js поставляемый Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,53 @@
/*
JQuery Curvy Corners by Mike Jolley -
http://blue-anvil.com
18th July 2008
v1.6 - B180708
*/
(function($){$.fn.corner=function(options){var settings={tl:{radius:8},tr:{radius:8},bl:{radius:8},br:{radius:8},antiAlias:true,autoPad:true,validTags:["div"]};if(options&&typeof(options)!='string')
$.extend(settings,options);return this.each(function(){new curvyObject(settings,this).applyCorners();});};function curvyObject(){this.box=arguments[1];this.settings=arguments[0];this.topContainer=null;this.bottomContainer=null;this.masterCorners=new Array();this.contentDIV=null;var boxPosition=$(this.box).css("position");var bgImage=$(this.box).css("backgroundImage");this.boxHeight=strip_px($(this.box).css("height"))?strip_px($(this.box).css("height")):this.box.scrollHeight;this.boxWidth=strip_px($(this.box).css("width"))?strip_px($(this.box).css("width")):this.box.scrollWidth;this.borderWidth=strip_px($(this.box).css("borderTopWidth"))?strip_px($(this.box).css("borderTopWidth")):0;this.boxPaddingTop=strip_px($(this.box).css("paddingTop"));this.boxPaddingBottom=strip_px($(this.box).css("paddingBottom"));this.boxPaddingLeft=strip_px($(this.box).css("paddingLeft"));this.boxPaddingRight=strip_px($(this.box).css("paddingRight"));this.boxColour=format_colour($(this.box).css("backgroundColor"));this.bgImage=(bgImage!="none"&&bgImage!="initial")?bgImage:"";this.boxContent=$(this.box).html();this.borderColour=format_colour($(this.box).css("borderTopColor"));this.borderString=this.borderWidth+"px"+" solid "+this.borderColour;$(this.box).css({"padding":"0px","borderColor":this.borderColour});if(boxPosition!="absolute")$(this.box).css("position","relative");if(($.browser.msie&&$.browser.version==6)&&this.boxWidth=="auto"&&this.boxHeight=="auto")$(this.box).css("width","100%");if(($.browser.msie)){$(this.box).css("zoom","1");$(this.box+" *").css("zoom","normal");}
if(this.settings.autoPad==true)
$(this.box).html("");this.applyCorners=function(){var topMaxRadius=Math.max(this.settings.tl?this.settings.tl.radius:0,this.settings.tr?this.settings.tr.radius:0);var botMaxRadius=Math.max(this.settings.bl?this.settings.bl.radius:0,this.settings.br?this.settings.br.radius:0);for(var t=0;t<2;t++){switch(t){case 0:if(this.settings.tl||this.settings.tr){var newMainContainer=document.createElement("div");this.topContainer=this.box.appendChild(newMainContainer);$(this.topContainer).css({width:"100%","font-size":"1px",overflow:"hidden",position:"absolute","padding-left":this.borderWidth,"padding-right":this.borderWidth,height:topMaxRadius+"px",top:0-topMaxRadius+"px",left:0-this.borderWidth+"px"});};break;case 1:if(this.settings.bl||this.settings.br){var newMainContainer=document.createElement("div");this.bottomContainer=this.box.appendChild(newMainContainer);$(this.bottomContainer).css({width:"100%","font-size":"1px",overflow:"hidden",position:"absolute","padding-left":this.borderWidth,"padding-right":this.borderWidth,height:botMaxRadius,bottom:0-botMaxRadius+"px",left:0-this.borderWidth+"px"});};break;};};if(this.settings.autoPad==true){var contentContainer=document.createElement("div");var contentContainer2=document.createElement("div");var clearDiv=document.createElement("div");$(contentContainer2).css({margin:"0","padding-bottom":this.boxPaddingBottom,"padding-top":this.boxPaddingTop,"padding-left":this.boxPaddingLeft,"padding-right":this.boxPaddingRight});$(contentContainer).css({position:"relative",float:"left",width:"100%","margin-top":"-"+(topMaxRadius-this.borderWidth)+"px","margin-bottom":"-"+(botMaxRadius-this.borderWidth)+"px"}).html(this.boxContent).addClass="autoPadDiv";$(clearDiv).css("clear","both");this.contentdiv=this.box.appendChild(contentContainer2);contentContainer2.appendChild(contentContainer);contentContainer2.appendChild(clearDiv);};if(this.topContainer)$(this.box).css("border-top",0);if(this.bottomContainer)$(this.box).css("border-bottom",0);var corners=["tr","tl","br","bl"];for(var i in corners){if(i>-1<4){var cc=corners[i];if(!this.settings[cc]){if(((cc=="tr"||cc=="tl")&&this.topContainer!=null)||((cc=="br"||cc=="bl")&&this.bottomContainer!=null)){var newCorner=document.createElement("div");$(newCorner).css({position:"relative","font-size":"1px",overflow:"hidden"});if(this.bgImage=="")
$(newCorner).css("background-color",this.boxColour);else
$(newCorner).css("background-image",this.bgImage).css("background-color",this.boxColour);;switch(cc)
{case"tl":$(newCorner).css({height:topMaxRadius-this.borderWidth,"margin-right":this.settings.tr.radius-(this.borderWidth*2),"border-left":this.borderString,"border-top":this.borderString,left:-this.borderWidth+"px","background-repeat":$(this.box).css("background-repeat"),"background-position":this.borderWidth+"px 0px"});break;case"tr":$(newCorner).css({height:topMaxRadius-this.borderWidth,"margin-left":this.settings.tl.radius-(this.borderWidth*2),"border-right":this.borderString,"border-top":this.borderString,left:this.borderWidth+"px","background-repeat":$(this.box).css("background-repeat"),"background-position":"-"+(topMaxRadius+this.borderWidth)+"px 0px"});break;case"bl":if(topMaxRadius>0)
$(newCorner).css({height:botMaxRadius-this.borderWidth,"margin-right":this.settings.br.radius-(this.borderWidth*2),"border-left":this.borderString,"border-bottom":this.borderString,left:-this.borderWidth+"px","background-repeat":$(this.box).css("background-repeat"),"background-position":"0px -"+($(this.box).height()+topMaxRadius-this.borderWidth+1)+"px"});else
$(newCorner).css({height:botMaxRadius-this.borderWidth,"margin-right":this.settings.br.radius-(this.borderWidth*2),"border-left":this.borderString,"border-bottom":this.borderString,left:-this.borderWidth+"px","background-repeat":$(this.box).css("background-repeat"),"background-position":"0px -"+($(this.box).height())+"px"});break;case"br":if(topMaxRadius>0)
$(newCorner).css({height:botMaxRadius-this.borderWidth,"margin-left":this.settings.bl.radius-(this.borderWidth*2),"border-right":this.borderString,"border-bottom":this.borderString,left:this.borderWidth+"px","background-repeat":$(this.box).css("background-repeat"),"background-position":"-"+this.settings.bl.radius+this.borderWidth+"px -"+($(this.box).height()+topMaxRadius-this.borderWidth+1)+"px"});else
$(newCorner).css({height:botMaxRadius-this.borderWidth,"margin-left":this.settings.bl.radius-(this.borderWidth*2),"border-right":this.borderString,"border-bottom":this.borderString,left:this.borderWidth+"px","background-repeat":$(this.box).css("background-repeat"),"background-position":"-"+this.settings.bl.radius+this.borderWidth+"px -"+($(this.box).height())+"px"});break;};};}else{if(this.masterCorners[this.settings[cc].radius]){var newCorner=this.masterCorners[this.settings[cc].radius].cloneNode(true);}else{var newCorner=document.createElement("DIV");$(newCorner).css({height:this.settings[cc].radius,width:this.settings[cc].radius,position:"absolute","font-size":"1px",overflow:"hidden"});var borderRadius=parseInt(this.settings[cc].radius-this.borderWidth);for(var intx=0,j=this.settings[cc].radius;intx<j;intx++){if((intx+1)>=borderRadius)
var y1=-1;else
var y1=(Math.floor(Math.sqrt(Math.pow(borderRadius,2)-Math.pow((intx+1),2)))-1);if(borderRadius!=j){if((intx)>=borderRadius)
var y2=-1;else
var y2=Math.ceil(Math.sqrt(Math.pow(borderRadius,2)-Math.pow(intx,2)));if((intx+1)>=j)
var y3=-1;else
var y3=(Math.floor(Math.sqrt(Math.pow(j,2)-Math.pow((intx+1),2)))-1);};if((intx)>=j)
var y4=-1;else
var y4=Math.ceil(Math.sqrt(Math.pow(j,2)-Math.pow(intx,2)));if(y1>-1)this.drawPixel(intx,0,this.boxColour,100,(y1+1),newCorner,-1,this.settings[cc].radius);if(borderRadius!=j){for(var inty=(y1+1);inty<y2;inty++){if(this.settings.antiAlias){if(this.bgImage!=""){var borderFract=(pixelFraction(intx,inty,borderRadius)*100);if(borderFract<30){this.drawPixel(intx,inty,this.borderColour,100,1,newCorner,0,this.settings[cc].radius);}else{this.drawPixel(intx,inty,this.borderColour,100,1,newCorner,-1,this.settings[cc].radius);};}else{var pixelcolour=BlendColour(this.boxColour,this.borderColour,pixelFraction(intx,inty,borderRadius));this.drawPixel(intx,inty,pixelcolour,100,1,newCorner,0,this.settings[cc].radius,cc);};};};if(this.settings.antiAlias){if(y3>=y2)
{if(y2==-1)y2=0;this.drawPixel(intx,y2,this.borderColour,100,(y3-y2+1),newCorner,0,0);}}else{if(y3>=y1)
{this.drawPixel(intx,(y1+1),this.borderColour,100,(y3-y1),newCorner,0,0);}};var outsideColour=this.borderColour;}else{var outsideColour=this.boxColour;var y3=y1;};if(this.settings.antiAlias){for(var inty=(y3+1);inty<y4;inty++){this.drawPixel(intx,inty,outsideColour,(pixelFraction(intx,inty,j)*100),1,newCorner,((this.borderWidth>0)?0:-1),this.settings[cc].radius);};};};this.masterCorners[this.settings[cc].radius]=newCorner.cloneNode(true);};if(cc!="br"){for(var t=0,k=newCorner.childNodes.length;t<k;t++){var pixelBar=newCorner.childNodes[t];var pixelBarTop=strip_px($(pixelBar).css("top"));var pixelBarLeft=strip_px($(pixelBar).css("left"));var pixelBarHeight=strip_px($(pixelBar).css("height"));if(cc=="tl"||cc=="bl"){$(pixelBar).css("left",this.settings[cc].radius-pixelBarLeft-1+"px");};if(cc=="tr"||cc=="tl"){$(pixelBar).css("top",this.settings[cc].radius-pixelBarHeight-pixelBarTop+"px");};switch(cc){case"tr":$(pixelBar).css("background-position","-"+Math.abs((this.boxWidth-this.settings[cc].radius+this.borderWidth)+pixelBarLeft)+"px -"+Math.abs(this.settings[cc].radius-pixelBarHeight-pixelBarTop-this.borderWidth)+"px");break;case"tl":$(pixelBar).css("background-position","-"+Math.abs((this.settings[cc].radius-pixelBarLeft-1)-this.borderWidth)+"px -"+Math.abs(this.settings[cc].radius-pixelBarHeight-pixelBarTop-this.borderWidth)+"px");break;case"bl":if(topMaxRadius>0)
$(pixelBar).css("background-position","-"+Math.abs((this.settings[cc].radius-pixelBarLeft-1)-this.borderWidth)+"px -"+Math.abs(($(this.box).height()+topMaxRadius-this.borderWidth+1))+"px");else
$(pixelBar).css("background-position","-"+Math.abs((this.settings[cc].radius-pixelBarLeft-1)-this.borderWidth)+"px -"+Math.abs(($(this.box).height()))+"px");break;};};};};if(newCorner){switch(cc){case"tl":if($(newCorner).css("position")=="absolute")$(newCorner).css("top","0");if($(newCorner).css("position")=="absolute")$(newCorner).css("left","0");if(this.topContainer)this.topContainer.appendChild(newCorner);break;case"tr":if($(newCorner).css("position")=="absolute")$(newCorner).css("top","0");if($(newCorner).css("position")=="absolute")$(newCorner).css("right","0");if(this.topContainer)this.topContainer.appendChild(newCorner);break;case"bl":if($(newCorner).css("position")=="absolute")$(newCorner).css("bottom","0");if(newCorner.style.position=="absolute")$(newCorner).css("left","0");if(this.bottomContainer)this.bottomContainer.appendChild(newCorner);break;case"br":if($(newCorner).css("position")=="absolute")$(newCorner).css("bottom","0");if($(newCorner).css("position")=="absolute")$(newCorner).css("right","0");if(this.bottomContainer)this.bottomContainer.appendChild(newCorner);break;};};};};var radiusDiff=new Array();radiusDiff["t"]=Math.abs(this.settings.tl.radius-this.settings.tr.radius);radiusDiff["b"]=Math.abs(this.settings.bl.radius-this.settings.br.radius);for(z in radiusDiff){if(z=="t"||z=="b"){if(radiusDiff[z]){var smallerCornerType=((this.settings[z+"l"].radius<this.settings[z+"r"].radius)?z+"l":z+"r");var newFiller=document.createElement("div");$(newFiller).css({height:radiusDiff[z],width:this.settings[smallerCornerType].radius+"px",position:"absolute","font-size":"1px",overflow:"hidden","background-color":this.boxColour});switch(smallerCornerType)
{case"tl":$(newFiller).css({"bottom":"0","left":"0","border-left":this.borderString});this.topContainer.appendChild(newFiller);break;case"tr":$(newFiller).css({"bottom":"0","right":"0","border-right":this.borderString});this.topContainer.appendChild(newFiller);break;case"bl":$(newFiller).css({"top":"0","left":"0","border-left":this.borderString});this.bottomContainer.appendChild(newFiller);break;case"br":$(newFiller).css({"top":"0","right":"0","border-right":this.borderString});this.bottomContainer.appendChild(newFiller);break;}};var newFillerBar=document.createElement("div");$(newFillerBar).css({position:"relative","font-size":"1px",overflow:"hidden","background-color":this.boxColour,"background-image":this.bgImage,"background-repeat":$(this.box).css("background-repeat")});switch(z){case"t":if(this.topContainer){if(this.settings.tl.radius&&this.settings.tr.radius){$(newFillerBar).css({height:topMaxRadius-this.borderWidth+"px","margin-left":this.settings.tl.radius-this.borderWidth+"px","margin-right":this.settings.tr.radius-this.borderWidth+"px","border-top":this.borderString});if(this.bgImage!="")
$(newFillerBar).css("background-position","-"+(topMaxRadius+this.borderWidth)+"px 0px");this.topContainer.appendChild(newFillerBar);};$(this.box).css("background-position","0px -"+(topMaxRadius-this.borderWidth+1)+"px");};break;case"b":if(this.bottomContainer){if(this.settings.bl.radius&&this.settings.br.radius){$(newFillerBar).css({height:botMaxRadius-this.borderWidth+"px","margin-left":this.settings.bl.radius-this.borderWidth+"px","margin-right":this.settings.br.radius-this.borderWidth+"px","border-bottom":this.borderString});if(this.bgImage!=""&&topMaxRadius>0)
$(newFillerBar).css("background-position","-"+(this.settings.bl.radius-this.borderWidth)+"px -"+($(this.box).height()+topMaxRadius-this.borderWidth+1)+"px");else
$(newFillerBar).css("background-position","-"+(this.settings.bl.radius-this.borderWidth)+"px -"+($(this.box).height())+"px");this.bottomContainer.appendChild(newFillerBar);};};break;};};};};this.drawPixel=function(intx,inty,colour,transAmount,height,newCorner,image,cornerRadius){var pixel=document.createElement("div");$(pixel).css({height:height,width:"1px",position:"absolute","font-size":"1px",overflow:"hidden"});var topMaxRadius=Math.max(this.settings["tr"].radius,this.settings["tl"].radius);if(image==-1&&this.bgImage!=""){if(topMaxRadius>0)
$(pixel).css("background-position","-"+((this.boxWidth-cornerRadius-this.borderWidth)+intx)+"px -"+(($(this.box).height()+topMaxRadius-this.borderWidth)-inty)+"px");else
$(pixel).css("background-position","-"+((this.boxWidth-cornerRadius-this.borderWidth)+intx)+"px -"+(($(this.box).height())-inty)+"px");$(pixel).css({"background-image":this.bgImage,"background-repeat":$(this.box).css("background-repeat"),"background-color":colour});}
else
{$(pixel).css("background-color",colour);};if(transAmount!=100)
setOpacity(pixel,transAmount);$(pixel).css({top:inty+"px",left:intx+"px"});newCorner.appendChild(pixel);};};function BlendColour(Col1,Col2,Col1Fraction){var red1=parseInt(Col1.substr(1,2),16);var green1=parseInt(Col1.substr(3,2),16);var blue1=parseInt(Col1.substr(5,2),16);var red2=parseInt(Col2.substr(1,2),16);var green2=parseInt(Col2.substr(3,2),16);var blue2=parseInt(Col2.substr(5,2),16);if(Col1Fraction>1||Col1Fraction<0)Col1Fraction=1;var endRed=Math.round((red1*Col1Fraction)+(red2*(1-Col1Fraction)));if(endRed>255)endRed=255;if(endRed<0)endRed=0;var endGreen=Math.round((green1*Col1Fraction)+(green2*(1-Col1Fraction)));if(endGreen>255)endGreen=255;if(endGreen<0)endGreen=0;var endBlue=Math.round((blue1*Col1Fraction)+(blue2*(1-Col1Fraction)));if(endBlue>255)endBlue=255;if(endBlue<0)endBlue=0;return"#"+IntToHex(endRed)+IntToHex(endGreen)+IntToHex(endBlue);};function IntToHex(strNum){base=strNum/16;rem=strNum%16;base=base-(rem/16);baseS=MakeHex(base);remS=MakeHex(rem);return baseS+''+remS;};function MakeHex(x){if((x>=0)&&(x<=9)){return x;}else{switch(x){case 10:return"A";case 11:return"B";case 12:return"C";case 13:return"D";case 14:return"E";case 15:return"F";};};};function pixelFraction(x,y,r){var pixelfraction=0;var xvalues=new Array(1);var yvalues=new Array(1);var point=0;var whatsides="";var intersect=Math.sqrt((Math.pow(r,2)-Math.pow(x,2)));if((intersect>=y)&&(intersect<(y+1))){whatsides="Left";xvalues[point]=0;yvalues[point]=intersect-y;point=point+1;};var intersect=Math.sqrt((Math.pow(r,2)-Math.pow(y+1,2)));if((intersect>=x)&&(intersect<(x+1))){whatsides=whatsides+"Top";xvalues[point]=intersect-x;yvalues[point]=1;point=point+1;};var intersect=Math.sqrt((Math.pow(r,2)-Math.pow(x+1,2)));if((intersect>=y)&&(intersect<(y+1))){whatsides=whatsides+"Right";xvalues[point]=1;yvalues[point]=intersect-y;point=point+1;};var intersect=Math.sqrt((Math.pow(r,2)-Math.pow(y,2)));if((intersect>=x)&&(intersect<(x+1))){whatsides=whatsides+"Bottom";xvalues[point]=intersect-x;yvalues[point]=0;};switch(whatsides){case"LeftRight":pixelfraction=Math.min(yvalues[0],yvalues[1])+((Math.max(yvalues[0],yvalues[1])-Math.min(yvalues[0],yvalues[1]))/2);break;case"TopRight":pixelfraction=1-(((1-xvalues[0])*(1-yvalues[1]))/2);break;case"TopBottom":pixelfraction=Math.min(xvalues[0],xvalues[1])+((Math.max(xvalues[0],xvalues[1])-Math.min(xvalues[0],xvalues[1]))/2);break;case"LeftBottom":pixelfraction=(yvalues[0]*xvalues[1])/2;break;default:pixelfraction=1;};return pixelfraction;};function rgb2Hex(rgbColour){try{var rgbArray=rgb2Array(rgbColour);var red=parseInt(rgbArray[0]);var green=parseInt(rgbArray[1]);var blue=parseInt(rgbArray[2]);var hexColour="#"+IntToHex(red)+IntToHex(green)+IntToHex(blue);}catch(e){alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");};return hexColour;};function rgb2Array(rgbColour){var rgbValues=rgbColour.substring(4,rgbColour.indexOf(")"));var rgbArray=rgbValues.split(", ");return rgbArray;};function setOpacity(obj,opacity){opacity=(opacity==100)?99.999:opacity;if($.browser.safari&&obj.tagName!="IFRAME")
{var rgbArray=rgb2Array(obj.style.backgroundColor);var red=parseInt(rgbArray[0]);var green=parseInt(rgbArray[1]);var blue=parseInt(rgbArray[2]);obj.style.backgroundColor="rgba("+red+", "+green+", "+blue+", "+opacity/100+")";}
else if(typeof(obj.style.opacity)!="undefined")
{obj.style.opacity=opacity/100;}
else if(typeof(obj.style.MozOpacity)!="undefined")
{obj.style.MozOpacity=opacity/100;}
else if(typeof(obj.style.filter)!="undefined")
{obj.style.filter="alpha(opacity:"+opacity+")";}
else if(typeof(obj.style.KHTMLOpacity)!="undefined")
{obj.style.KHTMLOpacity=opacity/100;}};function format_colour(colour){var returnColour="transparent";if(colour!=""&&colour!="transparent")
{if(colour.substr(0,3)=="rgb")
{returnColour=rgb2Hex(colour);}
else if(colour.length==4)
{returnColour="#"+colour.substring(1,2)+colour.substring(1,2)+colour.substring(2,3)+colour.substring(2,3)+colour.substring(3,4)+colour.substring(3,4);}
else
{returnColour=colour;};};return returnColour;};function strip_px(value){return parseInt(((value!="auto"&&value.indexOf("%")==-1&&value!=""&&value.indexOf("px")!==-1)?value.slice(0,value.indexOf("px")):0))}})(jQuery);

5
public/robots.txt Normal file
Просмотреть файл

@ -0,0 +1,5 @@
# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
# User-Agent: *
# Disallow: /

Просмотреть файл

@ -0,0 +1,119 @@
/* COLOR SCHEME
base: #FFE9B7
darker: #E3D185
green: #9AB54F
red: #6E212E
lred: #B5463F
*/
body {
background:#fff;
color: #333;
}
a { color: #6E212E; }
.center { text-align: center; }
.pad { padding: 5px; }
#toc { padding: 10px; font-size: 120%; }
#toc ul { display: inline; }
#toc ul li { display: inline; margin-left: 20px; margin-right: 20px;}
#toc ul li a { color: #240; }
ul.a-index li#m-index a, ul.a-about li#m-about a,
ul.a-documentation li#m-documentation a, ul.a-download li#m-download a,
ul.a-tools li#m-tools a { font-weight: bold; color: #fff; text-decoration: none;}
ul#about-list li { padding: 5px; }
ul#about-list li strong { color: #6E212E; }
.header h1 { text-align: center; }
.navbar { text-align: center; background: #9AB54F;}
.footer { text-align: center; background: #E3D185;}
.menu { padding: 10px; }
#header { min-height: 106px;}
h2.section-start { text-align:center; background: #9AB54F; color: #240; }
h3.title { background: #eee; padding: 5px;}
.inner { background: #FFE9B7; padding-bottom: 10px;}
.example { background: #eee; padding: 10px; }
img.book { border: 1px solid #666; }
#current-release #ver { font-size: 200%; color: #630; font-weight: bold; }
#current-release small { font-size: 80% !important; color: #888;}
#tip { text-align:center; padding: 20px 10px; font-size: 200%;}
#git-is { padding: 10px; margin-bottom: 15px; background: #FFE9B7;}
#git-is h3 { color: #630; font-size: 200%; font-weight: bold;}
#download-source { padding: 10px; padding-bottom:15px; background: #B5463F; }
#download-source h3 { color: #fff; font-weight: bold; text-align: center;}
#download-source h3 small { color: #eee; font-weight: normal; font-size: 70%;}
#using-git h3 { color: #6E212E; font-weight: bold;}
#using-git ul { font-size: 120%; color: #6E212E;}
#git-book { padding: 10px; text-align:center; color: #fff; font-size: 120%; background: #681;}
#git-book a { color: #E3D185; font-weight: bold; }
table tr td { vertical-align: top;}
table.data-table tr td { vertical-align: top;}
table.data-table tr td h3 { background: #B5463F; color: #fff; padding: 5px; }
table.data-table.hosting td { width:33%; }
table.data-table.software td { width:50%;}
table#authors tr td { font-size: 120%; }
table.bugmail td { border-bottom: 1px solid #f1f1f1; }
table.bugmail th { vertical-align: top; border-bottom: 1px solid #f1f1f1; }
#announce { text-align: center; padding: 5px; padding-bottom:15px; }
.doc-section { margin-top: 10px; }
.doc-section h2 { border-bottom: 1px solid #aaa; margin-bottom: 10px;
color: #141; background-color:#9AB54F; padding: 3px;}
.doc-section h3 { margin-bottom: 5px; margin-top: 8px; background: #eee; padding: 5px;}
.doc-toc { background: #eee; text-align: center; padding: 10px; margin-bottom: 10px; }
.doc-toc ul { margin: 0; display: inline; }
.doc-toc ul li { display: inline; padding: 0; margin: 0; margin-left: 5px; margin-right: 5px;}
.doc-toc ul li a { color: #240; }
table.ccmd td { border: 1px; padding-left: 2em; padding-right: 2em; }
table.ccmd { width: 99%; border: 1px solid #000; }
table.ccmd, code.g { font-family: monospace; }
table.ccmd td.g { width: 33%; }
table.ccmd td.g, code.g { font-weight: bold; }
table.ccmd td.g { background: #e9e8e1; color: #124; }
table.videos { width:100%;}
table.videos td { width:25%;}
.videos img { border: 1px solid #aaa; padding: 5px; background: #eee; }
#sfc-footer {
background: #9AB54F;
padding: 10px;
}
#sfc-footer a {
color: #350;
}
.appeal {
border: 2px solid #350;
background: #eee;
color: #350;
font-size: 30px;
font-weight: bold;
max-height: 95px;
margin-bottom: 30px;
}
.humourless {
font-size: 10px;
background: #eee;
color: #777;
}
.humourless a {
color: #555;
}

72
views/about.erb Normal file
Просмотреть файл

@ -0,0 +1,72 @@
<h2 id="about">About Git</h2>
<p>Git is distributed version control system focused on
speed, effectivity and real-world usability on large projects.
Its highlights include:</p>
<!-- Heavily inspired by Wikipedia -->
<ul id="about-list">
<li>
<strong>Distributed development.</strong>
Like most other modern version control systems, Git gives each developer
a local copy of the entire development history,
and changes are copied from one such repository to another.
These changes are imported as additional development branches,
and can be merged in the same way as a locally developed branch.
Repositories can be easily accessed via the efficient Git protocol
(optionally wrapped in ssh for authentication and security)
or simply using HTTP - you can publish your repository anywhere
without <em>any</em> special webserver configuration required.
</li>
<li>
<strong>Strong support for non-linear development.</strong>
Git supports rapid and convenient branching and merging,
and includes powerful tools for visualizing
and navigating a non-linear development history.
</li>
<li>
<strong>Efficient handling of large projects.</strong>
Git is very fast and scales well
even when working with large projects and long histories.
It is commonly an order of magnitude faster
than most other version control systems,
and several orders of magnitude faster on some operations.
It also uses an extremely efficient packed format
for long-term revision storage
that currently tops any other open source version control system.
</li>
<li>
<strong>Cryptographic authentication of history.</strong>
The Git history is stored in such a way
that the name of a particular revision (a "commit" in Git terms)
depends upon the complete development history leading up to that commit.
Once it is published, it is not possible to change the old versions
without it being noticed. Also, tags can be cryptographically signed.
</li>
<li>
<strong>Toolkit design.</strong>
Following the Unix tradition,
Git is a collection of many small tools written in C,
and a number of scripts that provide convenient wrappers.
Git provides tools for both easy human usage and easy
scripting to perform new clever operations.
</li>
</ul>
<p>Besides providing a version control system,
the Git project provides a generic low-level toolkit
for tree history storage and directory content management.
Traditionally, the toolkit is called the <em>plumbing</em>.
Aside the user interface coming with Git itself,
several other projects (so-called <em>porcelains</em>)
offer compatible version control interfaces - see the
<a href="/tools">related tools</a> list.</p>

73
views/appeal.erb Normal file
Просмотреть файл

@ -0,0 +1,73 @@
<div class="span-7">
<center>
<img src="/images/chaconbig.png"/>
<br/>
<br/>
<h3>Donate to Git Now!</h3>
<script type="text/javascript">
function validateAmount(amount){
if(amount.value.match( /^[0-9]+(\.([0-9]+))?$/)){
return true;
}else{
alert('You must enter a valid donation.');
amount.focus();
return false;
}
}
</script>
<form action="https://checkout.google.com/cws/v2/Donations/622836985124940/checkoutForm" id="BB_BuyButtonForm" method="post" name="BB_BuyButtonForm" onSubmit="return validateAmount(this.item_price_1)" target="_top">
<input name="item_name_1" type="hidden" value="Git Donation via Software Freedom Conservancy"/>
<input name="item_description_1" type="hidden" value="Donation to the Git Project via the Software Freedom Conservancy."/>
<input name="item_quantity_1" type="hidden" value="1"/>
<input name="item_currency_1" type="hidden" value="USD"/>
<input name="item_is_modifiable_1" type="hidden" value="true"/>
<input name="item_min_price_1" type="hidden" value="5.0"/>
<input name="item_max_price_1" type="hidden" value="25000.0"/>
<input name="_charset_" type="hidden" value="utf-8"/>
<table cellpadding="5" cellspacing="0" width="1%">
<tr>
<td align="right" nowrap="nowrap" width="1%">&#x24; <input id="item_price_1" name="item_price_1" onfocus="this.style.color='black'; this.value='';" size="11" style="color:grey;" type="text" value="Enter Amount"/>
</td>
<td align="left" width="1%">
<input alt="Donate" src="https://checkout.google.com/buttons/donateNow.gif?merchant_id=622836985124940&amp;w=115&amp;h=50&amp;style=white&amp;variant=text&amp;loc=en_US" type="image"/>
</td>
</tr>
</table>
</form>
<p>A temple for the mind, people.</p>
</center>
</div>
<div class="span-14 last">
<h3 class="title">From git-scm.com Maintainer Scott Chacon</h3>
<p>If everyone reading this donated a hundred and twelve dollars, our annual fundraiser would be over in just a few months.
Not everyone can or will donate. And thats fine, because each year just enough people support git-scm.com with a small donation. If you feel it's your turn, and you know it is, please make a small donation of $112, $227, $305 or whatever you can to keep git-scm.com free.</p>
<p>Most people don't know this, but I'm a volunteer. A classy, classy volunteer.</p>
<p>I don't get paid a cent for my work at git-scm.com, and neither do the thousands of Git project developers. The hosting of this incredibly high-traffic site costs in the millions of dollars a year. Recently, I have been approached by Oracle to buy the site and all the IP associated with it. They've promised me that they'll hold it benevolently.</p>
<p>Commerce is fine. Oracle may or may not be evil. But it doesn't belong here. Not in git-scm.com.</p>
<p>git-scm.com is something special. It is like a library, a public park or an extremely high-end brothel. It is like a temple for the mind. <strong>A <em>temple for the mind</em>, people.</strong> It is a place we can all go to think, to learn, to share our distributed code with others. It is a unique human project, the first<em>-ish</em> of its kind in history. It is a humanitarian project to bring a free distributed source code version control system to every single person on the planet. Twice.</p>
<p>Every single person.</p>
<p>Twice.</p>
<p>We're a small organization, and I've worked hard over the years to keep us lean and tight. Especially in the abdominals.</p>
<p>To do this without resorting to advertising, we need you. It is you who keep this dream alive. It is you who have created git-scm.com. It is you who believe that a place of calm reflection, distributed source control and learning is worth having.</p>
<p>This year, please consider making a donation to protect and sustain git-scm.com and the Git project.</p>
<p>Thanks,<br/>
Scott "Dragon" Chacon<br/>
git-scm.com Maintainer</p>
<div class="humourless">
This page is <a href="http://wikimediafoundation.org/wiki/WMFJA032/en/US">a parody</a>. Donations made will actually go to the <a href="/sfc">Git project</a> under the <a href="http://sfconservancy.org/news/2010/dec/16/git-joins/">Software Freedom Conservancy</a>.
</div>
</div>

86
views/course.erb Normal file
Просмотреть файл

@ -0,0 +1,86 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Git - Fast Version Control System</title>
<meta name="description" content="Home of the Git Version Control System and Friends" />
<meta name="authors" content="Petr Baudis, Scott Chacon" />
<meta http-equiv="reply-to" content="schacon@gmail.com" />
<meta http-equiv="content-language" content="en" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="icon" href="/favicon.png" type="image/png" />
<link rel="stylesheet" href="/blueprint/screen.css" type="text/css" media="screen, projection" />
<link rel="stylesheet" href="/blueprint/print.css" type="text/css" media="print" />
<!--[if IE]><link rel="stylesheet" href="blueprint/ie.css" type="text/css" media="screen, projection" /><![endif]-->
<link rel="stylesheet" href="/stylesheets/style.css" type="text/css" media="screen, projection" />
<script type="text/javascript" src="/javascripts/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="/javascripts/jquery.corner.js"></script>
<link rel="alternate" type="application/rss+xml" title="RSS"
href="http://feeds.feedburner.com/GitReleases">
</head>
<body>
<div class="container showgrids">
<div class="span-21 navbar">
<form id="searchbox">
<div id="toc">
<ul class="a-<%= @action %>">
<li id="m-index"><a href="/">Home</a></li>
<li id="m-about"><a href="/about">About Git</a></li>
<li id="m-documentation"><a href="/documentation">Documentation</a></li>
<li id="m-download"><a href="/download">Download</a></li>
<li id="m-tools"><a href="/tools">Tools & Hosting</a></li>
<!-- <li id="m-wiki"><a href="http://git.wiki.kernel.org/index.php/Main_Page">Wiki</a></li> -->
</ul>
</div>
</form>
</div>
<div class="span-21">
<br clear="both"/>
</div>
<%= yield %>
<div class="span-21">
<br/><br/>
</div>
<div class="span-21 footer">
<div class="menu">
This page is maintained by Scott Chacon as part of the <a href="http://git-scm.com">Git homepage</a>.<br/>
Please email me at <a href="mailto:schacon@gmail.com">schacon@gmail.com</a>
with <a href="http://github.com/schacon/gitscm">patches</a>, suggestions and comments.
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
$('.navbar').corner();
$('#searchbox').submit(function() {
term = $('#searchterm').val();
jQuery.facebox(function() {
jQuery.get('/page/searchbox?search=' + term, function(data) {
jQuery.facebox(data)
})
})
return false;
});
});
</script>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-82337-12");
pageTracker._initData();
pageTracker._trackPageview();
</script>
</body>
</html>

13
views/development.erb Normal file
Просмотреть файл

@ -0,0 +1,13 @@
<h2>Development</h2>
<p>The user discussion and development of Git and most tools related to Git
takes place on the Git mailing list - everyone is welcome to post
bug reports, feature requests, comments and
<a href="http://repo.or.cz/w/git.git?a=blob_plain;f=Documentation/SubmittingPatches;hb=HEAD">patches</a>
to <a href="mailto:git@vger.kernel.org">git@vger.kernel.org</a>.
To <a href="mailto:majordomo@vger.kernel.org?body=subscribe%20git">subscribe</a>
to the list, send an email with just "subscribe git" in the body to
majordomo@vger.kernel.org.
The mailing list archives are available at
<a href="http://dir.gmane.org/gmane.comp.version-control.git">Gmane</a>
and <a href="http://marc.info/?l=git">MARC</a>.</p>

188
views/documentation.erb Normal file
Просмотреть файл

@ -0,0 +1,188 @@
<div class="span-21">
<div id="git-book">
<img src="images/book.png" alt="" />
<a href="http://progit.org/book">Pro Git Book</a> :
The Creative Commons licensed freely available online book
</div>
</div>
<div class="span-21">
<br/>
</div>
<div class="span-11">
<h2 class="section-start" id="tutorials">Tutorials</h2>
<h3 class="title">Short and Sweet</h3>
<p>
The <a href="http://gitref.org">Git Reference site</a> is a online git reference built as a tutorial.
</p>
<p>The <a href="http://schacon.github.com/git/gittutorial.html"><strong>official Git tutorial</strong></a>
is a good place to get started.</p>
<p>
<a href="http://schacon.github.com/git/everyday.html">Everyday Git</a> in 20 commands is good
for a useful minimum set of commands.
</p>
<p>The <a href="/course/svn.html">SVN Crash Course</a> might be helpful if you're
coming from the SVN world.
</p>
<h3 class="title">Longer, More In Depth</h3>
<p>
<a href="http://hoth.entp.com/output/git_for_designers.html">
Git for Designers</a> &#8211; No knowledge of version control? No problem.
</p>
<p>
<a href="http://eagain.net/articles/git-for-computer-scientists/">
Git for Computer Scientists</a> &#8211; A quick introduction
to git internals for people who are not scared by words like Directed Acyclic Graph.
</p>
<p>The <a href="http://schacon.github.com/git/user-manual.html"><strong>Git User's Manual</strong></a>
is a comprehensive resource, covering a lot of Git functionality.
</p>
<p>
<a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/">Git Magic</a>
&#8211; An alternative online book with the source <a href="http://github.com/blynn/gitmagic/tree/master">online</a>.
</p>
<p>
<a href="http://help.github.com">Help.GitHub</a>
&#8211; Guides on a variety of Git and GitHub related topics
</p>
<h2 class="section-start" id="reference">Reference</h2>
<p>
The official and comprehensive
<a href="http://schacon.github.com/git/git.html">reference manual</a>
comes as part of the Git package itself
</p>
<p>
The <a href="http://refcardz.dzone.com/refcardz/getting-started-git">DZone RefCard</a> is a nice reference to keep handy
</p>
<p><a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html">
Visual Git Cheat Sheet</a> is a one page printable cheat sheet
</p>
</div>
<div class="span-10 last">
<h2 class="section-start" id="books">Books</h2>
<table>
<tr><td>
<div class="center">
<a href="http://peepcode.com/products/git-internals-pdf"><img class="book" width="120" src="/images/books/gitbook-cover.png" alt="" /></a><br/>
<a href="http://peepcode.com/products/git-internals-pdf">Git Internals PDF</a><br/>
by Scott Chacon
</div>
</td><td>
<div class="center">
<a href="http://www.amazon.com/gp/product/1934356158?ie=UTF8&amp;tag=prgi-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356158"><img class="book" width="120" src="/images/books/pvc_git.gif" alt="" /></a><img src="http://www.assoc-amazon.com/e/ir?t=prgi-20&amp;l=as2&amp;o=1&amp;a=1934356158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<br/>
<a href="http://www.pragprog.com/titles/tsgit/pragmatic-version-control-using-git">Pragmatic Version Control Using Git</a><br/>
by Travis Swicegood
</div>
</td></tr>
<tr><td>
<div class="center">
<a href="http://www.amazon.com/gp/product/0596520123?ie=UTF8&amp;tag=prgi-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596520123"><img class="book" width="120" src="/images/books/vcw_git.jpg" alt="" /></a><img src="http://www.assoc-amazon.com/e/ir?t=prgi-20&amp;l=as2&amp;o=1&amp;a=0596520123" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<br/>
<a href="http://www.amazon.com/Version-Control-Git-collaborative-development/dp/0596520123">Version Control with Git</a><br/>
by Jon Loeliger
</div>
</td><td>
<div class="center">
<a href="http://progit.org"><img class="book" width="120" src="/images/books/progit.jpg" alt="" /></a><br/>
<a href="http://progit.org">Pro Git</a><br/>
by Scott Chacon<br/>
<strong>Creative Commons Licensed</strong>
</div>
</td></tr>
<tr><td>
<div class="center">
<a href="http://www.amazon.com/gp/product/1934356727?ie=UTF8&amp;tag=prgi-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356727"><img class="book" width="120" src="/images/books/pg_git.jpg"></a><img src="http://www.assoc-amazon.com/e/ir?t=prgi-20&amp;l=as2&amp;o=1&amp;a=1934356727" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<br/>
<a href="http://www.pragprog.com/titles/pg_git/pragmatic-guide-to-git">Pragmatic Guide to Git</a><br/>
by Travis Swicegood
</div>
</td></tr>
</table>
</div>
<div class="span-21 videos">
<h2 class="section-start" id="videos">Videos</h2>
<table width="100%" class="videos">
<tr>
<td>
<a href="http://www.youtube.com/watch?v=4XpnKHJAok8">
<img width="160px" src="/images/videos/vid-linus.jpg" alt="" /></a><br/>
Linus Torvalds visits Google to share his thoughts on git,
the source control management system he created two years ago.
</td>
<td>
<a href="http://www.youtube.com/watch?v=8dhZ9BXQgc4">
<img width="160px" src="/images/videos/git-rs.jpg" alt="" /></a><br/>
A one-hour talk by Randal Schwartz describing what Git is, and
why it should be used over other revision control systems.
</td>
<td>
<a href="http://excess.org/article/2008/07/ogre-git-tutorial/">
<img width="160px" src="/images/videos/vid-ogre.jpg" alt="" /></a><br/>
<a href="http://excess.org/article/2008/07/ogre-git-tutorial/">
<strong>Git Tutorial Talk</strong></a> &#8211;
A recording of an excellent Git tutorial given by Bart Trojanowski for
the Ottawa Group of Ruby Enthusiasts.
</td>
</tr>
</table>
<p>
</p>
<p>
</p>
<p>
</p>
<p>
</p>
</div>
<hr />
<script type="text/javascript">
$(function() {
$('#git-book').corner();
});
</script>

95
views/download.erb Normal file
Просмотреть файл

@ -0,0 +1,95 @@
<div class="span-14">
<h2 id="download">Download</h2>
<h2 class="section-start">Binaries</h2>
<p>For people who prefer precompiled packages, these are available:</p>
<table class="bugmail">
<tr>
<th>RPMs</th>
<td></td>
<td><a href="http://kernel.org/pub/software/scm/git/RPMS/">http://kernel.org/pub/software/scm/git/RPMS/</a></td>
</tr>
<tr class="odd">
<th rowspan="3">Debs</th>
<td>Stable</td>
<td><a href="http://packages.debian.org/stable/git">http://packages.debian.org/stable/devel/git</a></td>
</tr>
<tr>
<td>Testing</td>
<td><a href="http://packages.debian.org/testing/devel/git">http://packages.debian.org/testing/devel/git</a></td>
</tr>
<tr class="odd">
<td>Unstable</td>
<td><a href="http://packages.debian.org/unstable/devel/git">http://packages.debian.org/unstable/devel/git</a></td>
</tr>
<tr>
<th rowspan="2">Win</th>
<td><a href="http://www.cygwin.com/">Cygwin</a></td>
<td><a href="http://www.cygwin.com/setup.exe">http://www.cygwin.com/setup.exe</a></td>
</tr>
<tr class="odd">
<td><a href="http://code.google.com/p/msysgit/">msysGit</a></td>
<td><a href="http://code.google.com/p/msysgit/downloads/list">http://code.google.com/p/msysgit/downloads/list</a></td>
</tr>
<tr class="odd">
<th>OS X</th>
<td>Stable</td>
<td><a href="http://code.google.com/p/git-osx-installer/downloads/list?can=3">http://code.google.com/p/git-osx-installer/downloads/list?can=3</a></td>
</tr>
<tr>
<th rowspan="2">Solaris</th>
<td>v8&ndash;10</td>
<td><a href="http://sunfreeware.com/">http://sunfreeware.com/</a></td>
</tr>
<tr class="odd">
<td><a href="http://opencsw.org/">v9&ndash;10</a></td>
<td><a href="http://opencsw.org/packages/git/">http://opencsw.org/packages/git/</a></td>
</tr>
</table>
</div>
<div class="span-7 last">
<%= erb :download_box %>
<br/>
<div class="center">
<h3 class="title">Development snapshots</h3>
<p>Daily snapshots of the main Git development branch are available at
<a href="http://www.codemonkey.org.uk/projects/git-snapshots/git/">codemonkey.org</a><br/>
(thanks to Dave Jones).</p>
</div>
</div>
<div class="span-21">
<h2 class="section-start">Git via Git</h2>
<p>If you already have Git installed, you can get the latest
development version via Git itself:</p>
<pre><strong>git clone git://github.com/gitster/git.git</strong></pre>
<p>If you have problems connecting (Git uses port 9418),
you can try to access the repository over the HTTP protocol:</p>
<pre><strong>git clone http://github.com/gitster/git.git</strong></pre>
<p>(this method works even behind firewalls and such).</p>
<p>You can also always browse the current contents
of the git repository using either
the <a href="http://repo.or.cz/w/git.git">gitweb</a>
or <a href="http://github.com/gister/git/tree/master">GitHub</a>
web interface.</p>
</div>

42
views/download_box.erb Normal file
Просмотреть файл

@ -0,0 +1,42 @@
<div id="download-source">
<h3>Download Git</h3>
<div class="inner">
<div class="center pad">
The latest stable Git release is
<div id="current-release">
<div id="ver">v<%= @version %></div>
</div>
<a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes/<%= @version %>.txt">release notes</a>
<small>(<%= @date %>)</small>
</div>
<table><tr><td style="width:33%">
<div class="center"><a href="http://code.google.com/p/msysgit/downloads/list?can=3"><img src="images/windows_big.png" alt="Windows" /></a></div>
</td><td style="width:33%">
<div class="center"><a href="http://code.google.com/p/git-osx-installer/downloads/list?can=3"><img src="images/osx_big.png" alt="Mac OSX" /></a></div>
</td><td style="width:33%">
<div class="center"><a href="http://kernel.org/pub/software/scm/git/git-<%= @version %>.tar.bz2"><img src="images/tux_big.png" alt="Source" /></a></div>
</td></tr>
<tr><td>
<div class="center"><a href="http://code.google.com/p/msysgit/downloads/list?can=3">Windows</a></div>
</td><td>
<div class="center"><a href="http://code.google.com/p/git-osx-installer/downloads/list?can=3">Mac OSX</a></div>
</td><td>
<div class="center"><a href="http://kernel.org/pub/software/scm/git/git-<%= @version %>.tar.bz2">Source</a></div>
</td></tr></table>
<div class="center">
<% if @download %>
<a href="/download">Other Download Options</a><br/>
<% else %>
<a href="http://www.kernel.org/pub/software/scm/git/">Older Releases</a><br/>
<% end %>
<a href="http://git.kernel.org/?p=git/git.git;a=summary">Git Source Repository</a>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
$('#download-source').corner();
$('.inner').corner();
});
</script>

18
views/feed.builder Normal file
Просмотреть файл

@ -0,0 +1,18 @@
xml.instruct! :xml, :version=>"1.0"
xml.rss(:version=>"2.0"){
xml.channel{
xml.title("Git Releases")
xml.link("http://git-scm.com/")
xml.description("Git Release Announcements")
xml.language('en-us')
@releases.each do |release|
xml.item do
xml.title(release[1])
xml.description(release[2])
xml.pubDate(release[0].strftime("%a, %d %b %Y %H:%M:%S %z"))
xml.link('http://git-scm.com/download')
xml.guid(release[1], "isPermaLink"=>"false")
end
end
}
}

15
views/fiveminutes.erb Normal file
Просмотреть файл

@ -0,0 +1,15 @@
<div class="doc-section">
<h1>Git in 5 Minutes</h1>
<!--
* getting git and first time setup
* cloning a repository
* making changes and committing
* creating a patch for email
* creating a new repo on github, pushing your fork there
-->
<p></p>
</div>

131
views/index.erb Normal file
Просмотреть файл

@ -0,0 +1,131 @@
<div span="span-21">
<div id="announce">
<strong>The <a href="https://www.survs.com/survey/VCAGZA8CT5">Git User's Survey 2011</a> is up!</strong>
&nbsp;
Please devote a few minutes of your time to fill it out, so we can improve Git!
</div>
</div>
<div class="span-9">
<div id="git-is">
<h3>Git is...</h3>
<p>Git is a <strong>free &amp; open source, distributed version control system</strong>
designed to handle everything from small to very large projects with
speed and efficiency.</p>
<p><strong>Every Git clone is a full-fledged repository</strong> with complete history
and full revision tracking capabilities, not dependent on network access
or a central server. <strong>Branching and merging are fast</strong> and easy to do.</p>
<p>Git is used for version control of files, much like tools such as
<a href="http://mercurial.selenic.com/">Mercurial</a>,
<a href="http://bazaar-vcs.org/">Bazaar</a>,
<a href="http://subversion.tigris.org/">Subversion</a>,
<a href="http://www.nongnu.org/cvs/">CVS</a>,
<a href="http://www.perforce.com/">Perforce</a>,
and <a href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions/team-foundation-server">Team Foundation Server</a>.
</p>
</div>
</div>
<div class="span-5">
<div id="using-git">
<h3>Projects using Git</h3>
<ul>
<li><a href="http://git.kernel.org/?p=git/git.git;a=summary">Git</a></li>
<li><a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=summary">Linux Kernel</a></li>
<li><a href="http://perl5.git.perl.org/perl.git">Perl</a></li>
<li><a href="http://git.eclipse.org">Eclipse</a></li>
<li><a href="http://git.gnome.org/cgit/">Gnome</a></li>
<li><a href="http://gitweb.kde.org/">KDE</a></li>
<li><a href="http://qt.gitorious.org">Qt</a></li>
<li><a href="http://github.com/rails/rails/tree/master">Ruby on Rails</a></li>
<li><a href="http://android.git.kernel.org">Android</a></li>
<li><a href="http://git.postgresql.org/gitweb">PostgreSQL</a></li>
<li><a href="http://git.debian.org/">Debian</a></li>
<li><a href="http://www.x.org/wiki/Development/git">X.org</a></li>
</ul>
</div>
</div>
<div class="span-7 last">
<%= erb :download_box %>
</div>
<div class="span-21">
<h2 class="section-start">Git Quick Start</h2>
</div>
<div class="span-11">
<div class="example">
<h3>Cloning and Creating a Patch</h3>
<pre>$ git clone git://github.com/git/hello-world.git
$ cd hello-world
$ (edit files)
$ git add (files)
$ git commit -m 'Explain what I changed'
$ git format-patch origin/master
</pre>
</div>
</div>
<div class="span-10 last">
<div class="example">
<h3>Creating and Commiting</h3>
<pre>$ cd (project-directory)
$ git init
$ (add some files)
$ git add .
$ git commit -m 'Initial commit'
</pre>
</div>
</div>
<br style="clear:both;" />
<br style="clear:both;" />
<div class="span-21">
<h2 class="section-start">Got a Question?</h2>
</div>
<div class="span-7">
<h3 class="title">Chat</h3>
<p>If you are curious about something, feel free to ask
on the IRC channel dedicated to Git -
<a href="irc://irc.freenode.net/git">#git on freenode</a>.</p>
</div>
<div class="span-7">
<h3 class="title">FAQ</h3>
<p>
If you have a question that you think might be common, you can
quickly check the
<a href="http://git.wiki.kernel.org/index.php/GitFaq">Git FAQ</a> page.
</p>
</div>
<div class="span-7 last">
<h3 class="title">Email</h3>
<p>You can also ask the Git community directly at our
<a href="http://dir.gmane.org/gmane.comp.version-control.git">git@vger.kernel.org mailing list</a>. Bug reports should be sent to this list.</p>
</div>
<div class="span-21">
<div id="tip">
To learn more about how to use Git, move along to the <a href="/documentation">Documentation</a>
</div>
</div>
<script type="text/javascript">
$(function() {
$('#git-is').corner();
$('.example').corner();
});
</script>

91
views/layout.erb Normal file
Просмотреть файл

@ -0,0 +1,91 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Git - Fast Version Control System</title>
<meta name="description" content="Home of the Git Version Control System and Friends" />
<meta name="authors" content="Petr Baudis, Scott Chacon" />
<meta http-equiv="reply-to" content="schacon@gmail.com" />
<meta http-equiv="content-language" content="en" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="icon" href="favicon.png" type="image/png" />
<link rel="stylesheet" href="blueprint/screen.css" type="text/css" media="screen, projection" />
<link rel="stylesheet" href="blueprint/print.css" type="text/css" media="print" />
<!--[if IE]><link rel="stylesheet" href="blueprint/ie.css" type="text/css" media="screen, projection" /><![endif]-->
<link rel="stylesheet" href="stylesheets/style.css" type="text/css" media="screen, projection" />
<script type="text/javascript" src="javascripts/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="javascripts/jquery.corner.js"></script>
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://feeds.feedburner.com/GitReleases" />
</head>
<body>
<div class="container showgrids">
<div class="span-21 header">
<a href="/"><img alt="Git - the fast version control system" src="/images/header.gif" /></a>
</div>
<div class="span-21 navbar">
<div id="toc">
<ul class="a-<%= @action %>">
<li id="m-index"><a href="/">Home</a></li>
<li id="m-about"><a href="/about">About Git</a></li>
<li id="m-documentation"><a href="/documentation">Documentation</a></li>
<li id="m-download"><a href="/download">Download</a></li>
<li id="m-tools"><a href="/tools">Tools &amp; Hosting</a></li>
<!-- <li id="m-wiki"><a href="http://git.wiki.kernel.org/index.php/Main_Page">Wiki</a></li> -->
</ul>
</div>
</div>
<div class="span-21">
<br/>
</div>
<%= yield %>
<div class="span-21">
<br/><br/>
</div>
<div class="span-4 center" id="sfc-footer">
Git is a member of the <a href="/sfc">Software Freedom Conservancy</a>
<br/>&nbsp;
</div>
<div class="span-13 footer">
<div class="menu">
This page is maintained by Scott Chacon.
<br/>
Please email me at <a href="mailto:schacon@gmail.com">schacon@gmail.com</a>
with patches, suggestions and comments.
<p>Source for this <a href="http://github.com/schacon/gitscm/tree/master">website</a>
was forked from Petr Baudis's <a href="http://git.or.cz/index.html">git.or.cz</a></p>
</div>
</div>
<div class="span-4 last center">
hosting donated by:
<a href="http://github.com"><img src="images/github.png" alt="github logo" /></a>
</div>
</div>
<script type="text/javascript">
$(function() {
$('.footer').corner();
$('#sfc-footer').corner();
});
</script>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-82337-12");
pageTracker._initData();
pageTracker._trackPageview();
</script>
</body>
</html>

91
views/sfc.erb Normal file
Просмотреть файл

@ -0,0 +1,91 @@
<h2 id="sfc">Git and The Software Freedom Conservancy</h2>
<p>Git is a member project of the <a href="http://sfconservancy.org/">Software
Freedom Conservancy</a>. The SFC is a not-for-profit organization that
provides financial and administrative assistance to open source projects.
<h2 class="section-start">Donation</h2>
<p>The SFC accepts donations on git's behalf. In the past, project money has
typically gone to defraying travel costs for developers to come to our annual
<a href="https://git.wiki.kernel.org/index.php/GitTogether">GitTogether</a>
mini-conference. A portion of the money goes to the SFC to cover their
operating expenses. You can also donate <a
href="http://sfconservancy.org/donate">directly</a> to the Conservancy's
general fund.
<table class="data-table software">
<tr><td valign="top">
<h3 class="title">Google Checkout</h3>
<p>To donate to git via Google Checkout:
<script type="text/javascript">
function validateAmount(amount){
if(amount.value.match( /^[0-9]+(\.([0-9]+))?$/)){
return true;
}else{
alert('You must enter a valid donation.');
amount.focus();
return false;
}
}
</script>
<form action="https://checkout.google.com/cws/v2/Donations/622836985124940/checkoutForm" id="BB_BuyButtonForm" method="post" name="BB_BuyButtonForm" onSubmit="return validateAmount(this.item_price_1)" target="_top">
<input name="item_name_1" type="hidden" value="Git Donation via Software Freedom Conservancy"/>
<input name="item_description_1" type="hidden" value="Donation to the Git Project via the Software Freedom Conservancy."/>
<input name="item_quantity_1" type="hidden" value="1"/>
<input name="item_currency_1" type="hidden" value="USD"/>
<input name="item_is_modifiable_1" type="hidden" value="true"/>
<input name="item_min_price_1" type="hidden" value="5.0"/>
<input name="item_max_price_1" type="hidden" value="25000.0"/>
<input name="_charset_" type="hidden" value="utf-8"/>
<table cellpadding="5" cellspacing="0" width="1%">
<tr>
<td align="right" nowrap="nowrap" width="1%">&#x24; <input id="item_price_1" name="item_price_1" onfocus="this.style.color='black'; this.value='';" size="11" style="color:grey;" type="text" value="Enter Amount"/>
</td>
<td align="left" width="1%">
<input alt="Donate" src="https://checkout.google.com/buttons/donateNow.gif?merchant_id=622836985124940&amp;w=115&amp;h=50&amp;style=white&amp;variant=text&amp;loc=en_US" type="image"/>
</td>
</tr>
</table>
</form>
</td><td valign="top">
<h3 class="title">Paypal</h3>
<p>We can also accept PayPal donations, but note that the fees are
higher for Paypal than other options, so less of your money makes it to
the project.
<div class="center">
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="GXTE9AECX4LAL">
<input type="image"
src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif"
border="0" name="submit"
alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" height="1" width="1"
src="https://www.paypal.com/en_US/i/scr/pixel.gif">
</form>
</div>
</td></tr>
</table>
<h3 class="title">Check or Wire</h3>
<p>We can also accept donations drawn in USD from banks in the USA
(donations from banks outside of the US or not in USD should be handled
by wire). Make checks payable to "Software Freedom Conservancy, Inc."
and place "Directed donation: Git" in the memo field. Checks should be
mailed to:
<div class="center">
<pre>
Software Freedom Conservancy, Inc.
137 Montague ST STE 380
BROOKLYN, NY 11201 USA
</pre>
</div>
<p>The SFC can accept wire donations, but the instructions vary
depending on the country of origin. Please contact <a
href="mailto:accounting@sfconservancy.org">accounting@sfconservancy.org</a>
for instructions.

530
views/svn.erb Normal file
Просмотреть файл

@ -0,0 +1,530 @@
<div class="doc-section">
<h1>Git - SVN Crash Course</h1>
<p>Welcome to the Git version control system! Here we will briefly
introduce you to Git usage based on your current Subversion knowledge. You will
need the latest <a href="http://git.or.cz/">Git</a> installed;
There is also a potentially useful
<a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">
tutorial</a> in the Git documentation.</p>
<div class="doc-toc">
<ul>
<li><a href="#read">How to Read Me</a></li>
<li><a href="#know">Things To Know</a></li>
<li><a href="#commit">Commiting</a></li>
<li><a href="#browse">Browsing</a></li>
<li><a href="#branch">Tagging and Branching</a></li>
<li><a href="#merge">Merging</a></li>
<li><a href="#remote">Going Remote</a></li>
<li><a href="#share">Sharing the Work</a></li>
</ul>
</div>
<div style="text-align:center;"><table class="relnotes" style="margin-left: auto; margin-right: auto; border: 1px">
<tr><td style="text-align:center;">
<p style="margin: 0em 0.4em">If you are just after tracking someone else's project,
this get you started quickly:</p>
<p/>
<table class="ccmd" style="margin:0em; margin-left: auto; margin-right: auto;"><tr>
<td class="g">git clone <em>url</em><br />git pull</td>
<td>svn&nbsp;checkout&nbsp;<em>url</em><br />svn update</td>
</tr></table>
</td></tr>
</table></div>
<hr />
<h2 id="read">How to Read Me</h2>
<p>In those small tables, at the left we always list the Git commands
for the task, while at the right the corresponding Subversion commands you would use
for the job are listed. If you are in hurry, just skimming over them should
give you a good idea about the Git usage basics.</p>
<p>Before running any command the first time, it's recommended that you
at least quickly skim through its manual page. Many of the commands have
very useful and interesting features (that we won't list here) and sometimes
there are some extra notes you might want to know. There's a quick usage
help available for the Git commands if you pass them the <code>-h</code>
switch.</p>
<h2 id="know">Things You Should Know</h2>
<p>There are couple important concepts it is good to know when
starting with Git. If you are in hurry though, you can skip this
section and only get back to it when you get seriously confused;
it should be possible to pick up with just using your intuition.</p>
<ul>
<li>
<b>Repositories.</b>
With Subversion, for each project there is a single repository at some
detached central place where all the history is and which you checkout
and commit into. Git works differently, each copy of the project tree
(we call that the <em>working copy</em>) carries its own repository
around (in the <code>.git</code> subdirectory in the project tree root).
So you can have local and remote branches.
You can also have a so-called <em>bare repository</em> which is not
attached to a working copy; that is useful especially when you want
to publish your repository. We will get to that.
</li>
<li>
<b>URL.</b>
In Subversion the <em>URL</em> identifies the location of the repository
and the path inside the repository, so you organize the layout of the
repository and its meaning. Normally you would have <code>trunk/</code>,
<code>branches/</code> and <code>tags/</code> directories. In Git
the <em>URL</em> is just the location of the repository, and it always
contains branches and tags. One of the branches is the default (normally named
master).
</li>
<li>
<b>Revisions.</b>
Subversion identifies revisions with ids of decimal numbers growing
monotonically which are typically small (although they can get quickly
to hundreds of thousands for large projects). That is impractical in distributed systems like Git. Git
identifies revisions with SHA1 ids, which are long 160-bit numbers
written in hexadecimal. It may look scary at first, but in practice it is
not a big hurdle - you can refer to the latest revision by <code>HEAD</code>,
its parent as <code>HEAD^</code> and its parent as <code>HEAD^^ = HEAD~2</code>
(you can go on adding carrets),
cut'n'paste helps a lot and you can write only the few leading digits
of a revision - as long as it is unique, Git will guess the rest.
(You can do even more advanced stuff with revision specifiers, see the
<a href="http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html">git-rev-parse manpage</a> for details.)
</li>
<li>
<b>Commits.</b>
Each commit has an <em>author</em> and a <em>committer</em> field,
which record who and when <em>created</em> the change and who <em>committed</em> it
(Git is designed to work well with patches coming by mail - in that case,
the author and the committer will be different). Git will try to guess
your realname and email, but especially with email it is likely to get it wrong.
You can check it using <code class="g">git config -l</code> and set them with:
<pre>
git config --global user.name "Your Name Comes Here"
git config --global user.email you@yourdomain.example.com
</pre>
</li>
<li>
<b>Commands.</b>
The Git commands are in the form <code>git command</code>.
You can interchangeably use the <code>git-command</code>
form as well.
</li>
<li>
<b>Colors.</b>
Git can produce colorful output with some commands; since
some people hate colors way more than the rest likes them, by default
the colors are turned off. If you would like to have colors in your
output:
<pre>
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
</pre>
</li>
<li>
<b>Visualize.</b>
You may find it convenient to watch your repository using
the <code class="g">gitk</code> repository as you go.
</li>
</ul>
<h2 id="commit">Commiting</h2>
<p>For the first introduction, let's make your project tracked by Git
and see how we get around to do daily development in it. Let's
<code>cd</code> to the directory with your project and initialize
a brand new Git repository with it:</p>
<table class="ccmd">
<tr><td class="g">git init<br/>git add .<br/>git commit</td>
<td>svnadmin create <em>repo</em><br/>svn import <em>file://repo</em></td></tr></table>
<p><code>git init</code> will initialize the repository,
<code>git add .</code> will add all the files under the current directory
and <code>git commit</code> will create the
initial import, given that repositories are coupled with working copies.</p>
<p>Now your tree is officially tracked by Git. You can explore the
<code class="g">.git</code> subdirectory a bit if you want, or don't if you
don't care. Do some random changes to your tree now - poke into few
files or such. Let's check what we've done:</p>
<table class="ccmd"><tr>
<td class="g">git diff</td>
<td>svn diff | less</td>
</tr></table>
<p>That's it. This is one of the more powerful commands. To get a diff with an
specific revision and path do:</p>
<table class="ccmd"><tr>
<td class="g">git diff <em>rev</em> <em>path</em></td>
<td>svn diff -r<em>rev</em> <em>path</em></td>
</tr></table>
<p>Git embeds special information in
the diffs about adds, removals and mode changes:</p>
<table class="ccmd"><tr>
<td class="g">git apply</td>
<td>patch -p0</td>
</tr></table>
<p>That will apply the patch while telling Git about and performing
those "meta-changes".</p>
<p>There is a more concise representation of changes available:</p>
<table class="ccmd"><tr>
<td class="g">git status</td>
<td>svn status</td>
</tr></table>
<p>This will show the concise changes summary as well as list any files
that you haven't either ignored or told Git about. In addition,
it will also show at the top which branch you are in.</p>
<p>While we are at the status command, over time plenty of the
"Untracked files" will get in there, denoting files not tracked by Git.
Wait a moment if you want to add them, run <code class="g">git clean</code>
if you want to get rid of all of them, or add them to the <code class="g">.gitignore</code>
file if you want to keep them around untracked (works the same as the <code>svn:ignore</code>
property in SVN).</p>
<p>To restore a file from the last revision:</p>
<table class="ccmd"><tr>
<td class="g">git checkout <em>path</em></td>
<td>svn revert <em>path</em></td>
</tr></table>
<p>You can restore everything or just specified files.</p>
<p>So, just like in SVN, you need to tell Git when you add, move or
remove any files:</p>
<table class="ccmd"><tr>
<td class="g">git add <em>file</em>
<br />git rm <em>file</em>
<br />git mv <em>file</em></td>
<td>svn add <em>file</em><br />svn rm <em>file</em><br />svn mv <em>file</em></td></tr></table>
<p>You can also recursively add/remove whole directories and so on;
Git's cool!</p>
<p>So, it's about time we commit our changes. Big surprise
about the command:</p>
<table class="ccmd"><tr>
<td class="g">git commit -a</td>
<td>svn commit</td>
</tr></table>
<p>to commit all the changes or, as with Subversion,
you can limit the commit only to specified files
and so on. A few words on the commit message: it is <em>customary</em>
to have a short commit summary as the first line of the message,
because various tools listing commits frequently show only the
first line of the message. You can specify the commit message
using the <code>-m</code> parameter as you are used, but
you can pass several <code>-m</code> arguments and they will create
separate paragraphs in the commit message:</p>
<p>If you don't pass any <code>-m</code> parameter or pass
the <code>-e</code> parameter, your favorite <code>$EDITOR</code>
will get run and you can compose your commit message there,
just as with Subversion. In addition, the list of files to be committed
is shown.</p>
<p>And as a bonus, if you pass it the <code>-v</code> parameter
it will show the whole patch being committed in the editor
so that you can do a quick last-time review.</p>
<p>By the way, if you screwed up committing, there's not much you
can do with Subversion, except using some enigmatic <code>svnadmin</code>
subcommands. Git does it better - you can amend your latest commit
(re-edit the metadata as well as update the tree) using
<code class="g">git commit --amend</code>, or toss your latest
commit away completely using <code class="g">git reset HEAD^</code>,
this will not change the working tree.</p>
<h2 id="browse">Browsing</h2>
<p>Now that we have committed some stuff, you might want to review
your history:</p>
<table class="ccmd"><tr>
<td class="g">git log<br />git blame <em>file</em></td>
<td>svn log | less<br />svn blame <em>file</em></td>
</tr></table>
<p>The log command works quite similar in SVN and Git; again,
<code>git log</code> is quite powerful, please look through
its options to see some of the stuff it can do.</p>
<p>The blame command is more powerful as it can detect the movement of lines,
even with file copies and renames. But there is a
big chance that you probably want to do something different! Usually,
when using annotate you are looking for the origin of some piece of
code, and the so-called <em>pickaxe</em> of Git is much more comfortable
tool for that job (<code>git log -S<em>string</em></code> shows the
commits which add or remove any file data matching <em>string</em>).</p>
<p>You can see the contents of a file, the listing of a directory or
a commit with:</p>
<table class="ccmd"><tr>
<td class="g">git show <em>rev</em>:<em>path/to/file</em>
<br />git&nbsp;show&nbsp;<em>rev</em>:<em>path/to/directory</em>
<br />git show <em>rev</em></td>
<td>svn cat <em>url</em>
<br />svn list <em>url</em>
<br />svn log -r<em>rev</em> <em>url</em>
<br />svn diff -c<em>rev</em> <em>url</em></td>
</tr></table>
<h2 id="branch">Tagging and branching</h2>
<p>Subversion marks certain checkpoints in history through copies, the copy is
usually placed in a directory named tags. Git tags are much more powerful.
The Git tag can have an arbitrary description attached (the first
line is special as in the commit case), some people actually store
the whole release announcements in the tag descriptions. The identity
of the person who tagged is stored (again following the same rules
as identity of the committer). You can tag other objects than commits (but
that is conceptually rather low-level operation).
And the tag can be cryptographically PGP signed to verify the identity
(by Git's nature of working, that signature also confirms the validity
of the associated revision, its history and tree). So, let's do it:</p>
<table class="ccmd"><tr>
<td class="g">git tag -a <em>name</em></td>
<td>svn copy http://example.com/svn/trunk
http://example.com/svn/tags/<em>name</em></td>
</tr></table>
<p>To list tags and to show the tag message:</p>
<table class="ccmd"><tr>
<td class="g">git tag -l<br />git show <em>tag</em></td>
<td>svn&nbsp;list&nbsp;http://example.com/svn/<em>tags/</em>
<br />svn&nbsp;log --limit&nbsp;1&nbsp;http://example.com/svn/tags/<em>tag</em></td>
</tr></table>
<p>Like Subversion, Git can do branches (surprise surprise!). In Subversion,
you basically copy your project to a subdirectory. In Git, you tell it,
well, to create a branch.</p>
<table class="ccmd"><tr>
<td class="g">git branch <em>branch</em>
<br />git&nbsp;checkout&nbsp;<em>branch</em></td>
<td>svn copy http://example.com/svn/trunk
http://example.com/svn/branches/<em>branch</em>
<br />svn switch
http://example.com/svn/branches/<em>branch</em></td>
</tr></table>
<p>The first command creates a branch, the second command switches
your tree to a certain branch. You can pass an extra argument to
<code>git branch</code> to base your new branch on a different
revision than the latest one.</p>
<p>You can list your branches conveniently using the aforementioned
<code>git-branch</code> command without arguments the listing of branches.
The current one is denoted by an "*".</p>
<table class="ccmd"><tr>
<td class="g">git branch</td>
<td>svn list http://example.com/svn/branches/</td>
</tr></table>
<p>To move your tree to some older revision, use:</p>
<table class="ccmd"><tr>
<td class="g">git checkout <em>rev</em>
<br />git checkout <em>prevbranch</em></td>
<td>svn update -r <em>rev</em><br />svn update</td>
</tr></table>
<p>or you could create a temporary branch. In Git you can make commits on
top of the older revision and use it as another branch.</p>
<h2 id="merge">Merging</h2>
<p>Git supports merging between branches much better than Subversion - history
of both branches is preserved over the merges and repeated merges
of the same branches are supported out-of-the-box. Make sure you are on
one of the to-be-merged branches and merge the other one now:</p>
<table class="ccmd"><tr>
<td class="g">git merge <em>branch</em></td>
<td>
svn merge -r 20:HEAD
http://example.com/svn/branches/<em>branch</em>
<br /><em>(assuming the branch was created in revision 20 and
you are inside a working copy of trunk)</em>
</td>
</tr></table>
<p>If changes were made on only one of the branches since the last merge,
they are simply replayed on your other branch (so-called <em>fast-forward merge</em>).
If changes were made on both branches, they are merged intelligently
(so-called <em>three-way merge</em>): if any changes conflicted, <code>git merge</code>
will report them and let you resolve them, updating the rest of the tree
already to the result state; you can <code>git commit</code> when you resolve
the conflicts. If no changes conflicted, a commit is made automatically with
a convenient log message (or you can do
<code class="g">git merge --no-commit <em>branch</em></code> to review the merge
result and then do the commit yourself).</p>
<p>Aside from merging, sometimes you want to just pick one commit from
a different branch. To apply the changes in revision <em>rev</em> and commit
them to the current branch use:</p>
<table class="ccmd"><tr>
<td class="g">git cherry-pick <em>rev</em></td>
<td>svn merge -c <em>rev</em> <em>url</em></td>
</tr></table>
<h2 id="remote">Going Remote</h2>
<p>So far, we have neglected that Git is a <em>distributed</em> version
control system. It is time for us to set the record straight - let's grab
some stuff from remote sites.</p>
<p>If you are working on someone else's project, you usually want to <em>clone</em>
its repository instead of starting your own. We've already mentioned that at the top
of this document:</p>
<table class="ccmd"><tr>
<td class="g">git clone <em>url</em></td>
<td>svn&nbsp;checkout&nbsp;<em>url</em></td>
</tr></table>
<p>Now you have the default branch (normally <code>master</code>),
but in addition you got all the remote branches and tags.
In clone's default setup, the default local branch tracks
the <em>origin</em> remote, which represents the default branch in the
remote repository.</p>
<p><em>Remote branch</em>, you ask? Well, so far we have worked
only with local branches. Remote branches are a mirror image of branches
in remote repositories and you don't ever switch to them directly or write
to them. Let me repeat - you never mess with remote branches. If you want
to switch to a remote branch, you need to create a corresponding local
branch which will "track" the remote branch:</p>
<table class="ccmd"><tr>
<td class="g">
git checkout -b <em>branch</em> origin/<em>branch</em></td>
<td>svn&nbsp;switch&nbsp;<em>url</em></td></tr></table>
<p>You can add more remote branches to a cloned repository, as well as just
an initialized one, using <code class="g">git remote add <em>remote</em> <em>url</em></code>.
The command <code class="g">git remote</code> lists all the remotes
repositories and <code class="g">git remote show <em>remote</em></code> shows
the branches in a remote repository.</p>
<p>Now, how do you get any new changes from a remote repository?
You fetch them: <code class="g">git fetch</code>.
At this point they are in your repository and you can examine them using
<code>git log <em>origin</em></code> (<code>git log HEAD..<em>origin</em></code>
to see just the changes you don't have in your branch), diff them, and obviously, merge them - just do
<code>git merge <em>origin</em></code>. Note that if you don't specify a branch
to fetch, it will conveniently default to the tracking remote.</p>
<p>Since you frequently just fetch + merge the tracking remote branch,
there is a command to automate that:</p>
<table class="ccmd"><tr>
<td class="g">git pull</td>
<td>svn update</td>
</tr></table>
<h2 id="share">Sharing the Work</h2>
<p>Your local repository can be used by others to <em>pull</em> changes, but
normally you would have a private repository and a public repository.
The public repository is where everybody pulls and you... do the
opposite? <em>Push</em> your changes? Yes!
We do <code class="g">git push <em>remote</em></code> which will push
all the local branches with a corresponding remote branch - note that this works
generally only over SSH (or HTTP but with special webserver setup).
It is highly recommended to setup a SSH key and an SSH agent mechanism
so that you don't have to type in a password all the time.</p>
<p>One important thing is that you should push only to remote branches
that are not currently checked out on the other side (for the same
reasons you never switch to a remote branch locally)! Otherwise the
working copy at the remote branch will get out of date and confusion
will ensue. The best way to avoid that is to push only to remote
repositories with no working copy at all - so called <em>bare</em>
repositories which are commonly used for public access or developers'
meeting point - just for exchange of history where a checked out copy
would be a waste of space anyway. You can create such a repository.
See <a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#setting-up-a-public-repository">Setting up a public repository</a> for details.</p>
<p>Git can work with the same workflow as Subversion, with a group of developers
using a single repository for exchange of their work. The only change
is that their changes aren't submitted automatically but they have
to push (however, you can setup a post-commit hook that will push for you
every time you commit; that loses the flexibility to fix up a screwed
commit, though). The developers must have either an entry in htaccess
(for HTTP DAV) or a UNIX account (for SSH). You can restrict their
shell account only to Git pushing/fetching by using the
<code class="g">git-shell</code> login shell.</p>
<p>You can also exchange patches by mail. Git has very good support
for patches incoming by mail. You can apply them by feeding mailboxes
with patch mails to <code class="g">git am</code>. If you
want to <em>send</em> patches use <code class="g">git format-patch</code> and
possibly <code class="g">git send-email</code>.
To maintain a set of patches it is best to use
the <strong>StGIT</strong> tool (see
the <a href="stgit.html">StGIT Crash Course</a>).</p>
<p>If you have any questions or problems which are not obvious from
the documentation, please contact us at the <strong>Git mailing list</strong>
at <a href="mailto:git@vger.kernel.org">git@vger.kernel.org</a>.
We hope you enjoy using Git!</p>
</div>

151
views/tools.erb Normal file
Просмотреть файл

@ -0,0 +1,151 @@
<h2 id="tools">Interface Tools</h2>
<p>Git is a true UNIX tool in the sense that it consists of many commands
that do one thing well. It has been designed from the start to be easily
wrapped in other tools and frontends. Currently, there are several
interfaces offering more comfortable Git usage, and also graphical
interfaces for browsing the history and more.</p>
<p>Traditionally, the low-level part of Git is called <em>plumbing</em>
and the interfaces and frontends are called <em>porcelains</em>.
Git itself comes with a default porcelain bundled and that is actually
what you will normally mean when you say you use Git. However, there
are several alternative porcelains which might offer considerably more
user friendly interface or extend Git to perform some specialized tasks.</p>
<p>Below, the most widely used tools are listed. Please refer to
<a href="http://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools">the corresponding wiki page</a>
for a full list.</p>
<table class="data-table software">
<tr valign="top">
<td>
<h3 class="title">Graphical User Interfaces</h3>
<dl>
<dt id="gitextensions">Git Extensions (Windows)</dt>
<dd><a href="http://sourceforge.net/projects/gitextensions/">Git Extensions</a>
is a small toolset to make working with Git under Windows a
little more intuitive. The shell extension will intergrate in Windows Explorer
and presents a nice context menu on files.</dd>
<dt id="tortoisegit">TortoiseGit (Windows)</dt>
<dd><a href="http://code.google.com/p/tortoisegit/">TortoiseGit</a>
is a port of the popular TortoiseSVN project to Git.
TortoiseGit is very complete, able to commit, show the history log, diff two versions,
create branches and tags, create patches and more.</dd>
<dt id="gitx">GitX (Mac OS X)</dt>
<dd><a href="http://gitx.frim.nl">GitX</a>
is a git GUI specifically for Mac OS X. It currently features a history viewer
much like gitk and a commit GUI like git gui. But then in silky smooth OS X style!</dd>
<dt id="qgit">qgit (Qt)</dt>
<dd><a href="http://sourceforge.net/projects/qgit">qgit</a> is a Qt
GUI for browsing history of Git repositories, similar to <em>gitk</em>
but with more features.</dd>
<dt id="tig">Tig</dt>
<dd><a href="http://jonas.nitro.dk/tig/">tig</a>
is a text-mode interface for Git. It acts as a repository browser
that can also act as a pager for various Git commands
and manage your index (on diff chunk level).</dd>
</dl>
</td>
<td>
<h3>Version Control Interface layers</h3>
<dl>
<dt id="stgit">StGIT</dt>
<dd><a href="http://www.procode.org/stgit/">Stacked Git</a> provides
a <em>Quilt</em>-like patch management functionality in the Git environment.
You can easily manage your patches in the scope of Git until they get
merged upstream.</dd>
<dt id="guilt">Guilt</dt>
<dd><a href="http://www.kernel.org/pub/linux/kernel/people/jsipek/guilt/">Guilt</a>
is another patch management tool, closer to the spirit of <em>Quilt</em>
than StGIT.</dd>
<dt id="cogito">TopGit</dt>
<dd><a href="http://repo.or.cz/w/topgit.git">TopGit</a>
aims to make handling of large amount of interdependent topic branches easier.
TopGit achieves that by keeping a separate topic branch
for each patch and providing few tools to maintain the branches.</dd>
</dl>
</td>
</tr>
</table>
<h2 id="hosting">Git Hosting</h2>
<p>Several Git hosting sites are available and open for anyone
to host their projects publicly or privately, serving personal open source
projects up to large professional endeavors:</p>
<table class="data-table hosting">
<tr>
<td>
<h3>Public Only Hosting</h3>
<dl>
<dt id="repo">repo.or.cz</dt>
<dd><a href="http://repo.or.cz/">repo.or.cz</a> is the oldest hosting site,
accomodating many hundreds of projects, with open-sourced infrastructure
and aimed at open source software. It provides full push features as well
as simple mirroring mode and gitweb interface with various enhancements.</dd>
<dt id="gitorious">Gitorious</dt>
<dd><a href="http://gitorious.org/">Gitorious</a> is another free hosting
site with a custom web interface, supporting multiple repositories per project,
local installations and with open source code.</dd>
</dl>
</td>
<td>
<h3>Public and Private Hosting</h3>
<dl>
<dt id="github">GitHub</dt>
<dd><a href="http://github.com/">GitHub</a> is the largest hosting site with over
1,000,000 public repositories and
provides both free hosting for public projects and paid options for private
projects. It uses a custom web interface including git-backed wiki hosting,
git-backed static site hosting and ticketing. GitHub puts emphasis
on social networking of project developers.</dd>
</dl>
</td>
<td>
<h3>Private Only Hosting</h3>
<dl>
<dt id="unfuddle">Unfuddle</dt>
<dd>
<a href="http://unfuddle.com/">Unfuddle</a> is a secure, hosted project
management solution for software development teams.
Offers secure code repositories, ticketing systems and
project management tools.
</dd>
<dt id="codebase">codebase</dt>
<dd>
<a href="http://www.codebasehq.com/">codebase</a> offers
source control, issue/ticket management &amp; deployment tracking.
</dd>
</dl>
</td>
</tr>
</table>
<p style="text-align: right; font-size: small"><a href="http://git.wiki.kernel.org/index.php/GitHosting">more sites</a></p>