Começando com GIT. Parte 1
February 22, 2009 at 3:07 am | In GIT | 3 CommentsOlá pessoal, a algum tempo já postei aqui como fazer para instalar e configurar o GIT
no Ubuntu Linux, e disse que haveria mais sobre o git aqui no blog, pois bem passou maior
tempão e não postei nada sobre o GIT, pois bem, aqui estou, nesse segundo post sobre git vamos dar uma olhada
no básico do git, vamos criar um “projeto” de “mentira” para simularmos o uso básico do git.
1 – Começando…
Para começar vamos criar um diretório para armazenar nosso “projeto”, vamos chamar esse
diretório de ‘demo’, dentro dele vamos criar uma pasta libs uma log e alguns arquivos,
então vamos para o nosso bom o velho terminal.
OBS: Estou rodando no Ubuntu, caso você seja do mundo Windows recomendo seguir os
passos do ótimo post do Fábio Akita sobre como montar um ambiente de programacão
Ruby/Rails no Windows, esse inclue o GIT.
Bem dito isso … no terminal:
mkdir demo
cd demo
mkdir libs logs
touch file1.rb file2.rb file3.rb file4.rb
Bom acho que não prescisa nem explicar… criamos as pastas com mkdir e alguns arquivo com
o touch, bom nosso diretório demo esta assim:
.
|– file1.rb
|– file2.rb
|– file3.rb
|– file4.rb
|– libs
`– logs
2 directories, 4 files
2 – O arquivo .gitignore.
Esse arquivo é de grande importância nele podemos definir o que queremos que o git ignore
por exemplo, arquivos de log (nossa pasta log, por exemplo) não necessita de controle de
versão, um pasta que contém algumas imagem usada no projeto idem e assim por diante,
aqui entra seus critérios do que você não quer que o git controle.
No meu caso eu costumo ainda adicionar um linha para ele ignorar os arquivos temp(~),
que o editor(gvim, gedit…) cria.
Tendo isso em mente podemos criar nosso .gitignore.
touch .gitignore
gvim .gitignore
Acima criamos o arquivo .gitignore e abrimos ele com o gvim e digitamos o seguinte:
log/*.*
*.rb~
OBS1: Isso não é nada “mundo real” como não estou criando um projeto de verdade não irei
ter arquivo de log (.log) de verdade, então simplesmente mandei ele ignorar tudo dentro
da pasta log/, apenas para demonstração.
3 – Inicializando o GIT…
Agora vamos colocar o GIT em ação para inicializar o repositório git usamos o comando
git init… então na pasta demo ….
git init
você irá receber a seguinte mensagem:
Initialized empty Git repository in /home/edipo/Desktop/demo/.git/
Tudo OK, nosso repositório foi inicializado.
Agora se você der um ls -la(lista arquivos incluindo ocultos) irá ter algo assim:
ls -la
total 32
drwxr-xr-x 5 edipo edipo 4096 2009-02-20 00:52 .
drwxr-xr-x 11 edipo edipo 4096 2009-02-20 00:20 ..
-rw-r–r– 1 edipo edipo 0 2009-02-20 00:21 file1.rb
-rw-r–r– 1 edipo edipo 0 2009-02-20 00:21 file2.rb
-rw-r–r– 1 edipo edipo 0 2009-02-20 00:21 file3.rb
-rw-r–r– 1 edipo edipo 0 2009-02-20 00:21 file4.rb
drwxr-xr-x 7 edipo edipo 4096 2009-02-20 00:52 .git
-rw-r–r– 1 edipo edipo 0 2009-02-20 00:34 .gitignore
drwxr-xr-x 2 edipo edipo 4096 2009-02-20 00:20 libs
drwxr-xr-x 2 edipo edipo 4096 2009-02-20 00:20 logs
4 – Adicionando os arquivos ao git…
Agora que já temos nossos arquivos, incluindo o .gitignore e nosso repositório inicializado
podemos adicionar nossos arquivos ao git, para fazer isso você usa o comando git add .
o .(ponto) do comando quer dizer TODOS arquivos, mas você também pode adicionar somente um
usando por exemplo git add nome_arquivo.
Bom vamos ver em que estado estamos agora, para isso temo o camando git status que nós diz
como as coisas estão:
git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use “git rm –cached <file>…” to unstage)
#
# new file: .gitignore
# new file: file1.rb
# new file: file2.rb
# new file: file3.rb
# new file: file4.rb
#
e ai está temos nossos novos arquivos, agora pricisamos fazer o primeiro commit para isso
usamos o comando git commit -m -a ‘mensagem’, bom -m quer dizer que queremos colocar
uma mensagem e -a todos os arquivos, você pode também usar somente commit -a
ai ele irá abrir seu editor de texto padrão então você adiciona sua mensagem no arquivo
que será aberto, então:
git commit -a
o vim será aberto digito ‘i’ para ir para o modo de edição e digito a mensagem “Primeiro
Commit” dou ESC e
para sair e salvar, pronto vou receber o seguinte no terminal:
git commit -a
Created initial commit 3825061: Primeiro Commit
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 .gitignore
create mode 100644 file1.rb
create mode 100644 file2.rb
create mode 100644 file3.rb
create mode 100644 file4.rb
Ok está ai os arquivos, agora podemos usar o comando git log para ver como estão as coisas:
git log
commit 382506110486d1d89de8debbe8ef54f0bd83d8c2
Author: edipo <edipofederle@gmail.com>
Date: Fri Feb 20 12:46:23 2009 -0300
Primeiro Commit
Então ai está o nosso primeir o commit.
5 – Modificações…
Bom legal até agora, vamos agora modificar alguns arquivo para a ver como o git age.
vim file1.rb
i
vamos criar uma simples classe Ruby nesse arquivo, coloque o seguinte ou qualquer outra
coisa que você queira.
class File1
def hello(name)
puts "Hello #{name}."
end
end
salve o arquivo, voltando ao terminal usamos o git status para ver se algo mudou..
git status
# On branch master
# Changed but not updated:
# (use “git add <file>…” to update what will be committed)
#
# modified: file1.rb
#
no changes added to commit (use “git add” and/or “git commit -a”)
Bom, ai está o nosso arquivo que fizemos a mudança, antes de dar um commit precisamos adicioná-lo então…
git add file1.rb
agora rodando o git status temos:
git status
# On branch master
# Changes to be committed:
# (use “git reset HEAD <file>…” to unstage)
#
# modified: file1.rb
#
Vamos fazer mais uma mundaça agora no arquivo file2.rb, vamos colocar algo simples nele como isso:
class File2
def sum(x,y)
x + y
end
end
Ok, agora que alteramos outro arquivos vamos usar o comando git status para ver como estão as coisas:
git status
# On branch master
# Changes to be committed:
# (use “git reset HEAD <file>…” to unstage)
#
# modified: file1.rb
#
# Changed but not updated:
# (use “git add <file>…” to update what will be committed)
#
# modified: file2.rb
Agora o git nos diz que temos dois arquivos modificados mas somente um( file1.rb) para ser ‘committed’, então
agora damos um:
git commit
ele irá abrir o seu editor com o seguinte conteudo:
# Please enter the commit message for your changes.
3 # (Comment lines starting with ‘#’ will not be included)
4 #
5 # Committer: edipo <edipofederle@gmail.com>
6 #
7 # On branch master
8 # Changes to be committed:
9 # (use “git reset HEAD <file>…” to unstage)
10 #
11 # modified: file1.rb
12 #
13 # Changed but not updated:
14 # (use “git add <file>…” to update what will be committed)
15 #
16 # modified: file2.rb
No inicio do arquivo digite a mensagem do commit, – Commit somente para file1.rb nao para file2.rb”
salve, e você irá receber a seguinte mensagem:
Created commit bc36724: Apenas Commit do file1.rb nao do file2.rb
1 files changed, 5 insertions(+), 0 deletions(-)
e dando um git status temos:
git status
# On branch master
# Changed but not updated:
# (use “git add <file>…” to update what will be committed)
#
# modified: file2.rb
#
no changes added to commit (use “git add” and/or “git commit -a”)
Então temos o file2.rb que ainda nao foi add, vamos fazer mais alguma modificação em algum arquivo.
e dadando um git status agora temos os dois arquivos que foram modificados:
git status
# On branch master
# Changed but not updated:
# (use “git add <file>…” to update what will be committed)
#
# modified: file2.rb
# modified: file3.rb
se dermos um git commit iremos receber a mesma acima:
git commit
# On branch master
# Changed but not updated:
# (use “git add <file>…” to update what will be committed)
#
# modified: file2.rb
# modified: file3.rb
#
no changes added to commit (use “git add” and/or “git commit -a”)
Agora temos duas modificações vamos fazer um commit adicionando todos(dois) arquivos, para isso:
commit -a
a opcão -a é para add todos arquivos, deixamos ele assim:
1 Adicionando todas as modificacoes
2 # Please enter the commit message for your changes.
3 # (Comment lines starting with ‘#’ will not be included)
4 #
5 # Committer: edipo <edipofederle@gmail.com>
6 #
7 # On branch master
8 # Changes to be committed:
9 # (use “git reset HEAD <file>…” to unstage)
10 #
11 # modified: file2.rb
12 # modified: file3.rb
13 #
recebemos o seguinte ao salvar o arquivo:
Created commit 6c010c9: Adicionando todas as modificacoes
2 files changed, 10 insertions(+), 0 deletions(-)
Ok, ai esta, agora vamo ver como ta nosso log:
git log
commit 6c010c9a8168c5c4978125e57eab7f82b795e82b
Author: edipo <edipofederle@gmail.com>
Date: Fri Feb 20 22:37:30 2009 -0300
Adicionando todas as modificacoes
commit bc36724bdfd5411466f27d72ce9dede1164478a3
Author: edipo <edipofederle@gmail.com>
Date: Fri Feb 20 22:13:37 2009 -0300
Apenas Commit do file1.rb nao do file2.rb
commit 382506110486d1d89de8debbe8ef54f0bd83d8c2
Author: edipo <edipofederle@gmail.com>
Date: Fri Feb 20 12:46:23 2009 -0300
Primeiro Commit
Bom é isso nesse post, já deu para perceber o quão legal é o git, e como ele deixa as coisas organizadas, obviamente isso nao é um projeto real, e estamos “desenvolvendo” sozinhos, mas para fins de aprendizado creio que já deu para pegar algo, no próximo post iremos dar uma olhada em branchs e merges, é isso ai pessoal, espero que venha a ajudar alguem, por favor se alguem achar algum erro nesse post faza-me saber deixando um comentário, e se você
gostou tembém deixe um comentário, até mais pessoal e usem o GIT
URL Amigáveis em PHP.
February 9, 2009 at 1:19 am | In php | Leave a CommentSuponha que você tenha um script como posts.php na raiz de seu site, então temos uma URL como esta: http://www.yoursite.com/blog.php. Tal página é utilizada para exibir os posts, o post em questão é encontrado sendo passado dois paramentros para a URL, cat(category) e id.
Com base nisso temos o acesso a um certo post digamos o terceiro post que foi gravado no banco acessando a seguinte URL: http://youtsite.com/blog.php?id=3.
Bem essa é a forma como muitos o fazem, mas existem alguns problemas com isso, não problema de execução, isso funciona corretamente, alguns problemas são: esse tipo de URL é MAL indexada pelos sistemas de busca( leia-se Google), esse tipo de URL é aquelas que o fazem dizer “Eca, isso é feio.”, bem isto não é tão feio, você pode encontra algo ainda mais feio, assim:
http://www.example.com/index/Y29udGVudD1vdXRwdXRfbGlzdCZhY3Rpb249c2V0YXJyYXk==
Uma maneira de melhorar isso seria usar uma URL no seguinte estilo:
http://yoursite.com.br/blog/web/1/
ou
http://yoursite.com.br/posts/web/how_write_a_book/
Habilitando o suporte a Rewrite.
Aqui creio eu reside umas das desvantagens de se usar o Rewrite, localmente não temos problemas com isso pois temos total acesso aos arquivos de configuração do apache, já a história muda quando se trata do servidor remoto, onde você hospeda se código, muitos servers não tem essa opção habilidade, alguns após o pedido podem liberar isso para você outros não, com isso em mente vamos seguir em frente.
Para habilitar o suporte você deve acessar o arquivo /etc/apache2/sites-enabled/000-default
Irá ter um trecho igual a esse:
1 <Directory /var/www/>
2 Options Indexes FollowSymLinks MultiViews
3 AllowOverride None
4 Order allow,deny
5 allow from all
6 </Directory>
Mude para
1 <Directory /var/www/>
2 Options Indexes FollowSymLinks MultiViews
3 AllowOverride All
4 Order allow,deny
5 allow from all
6 </Directory>
Isso serve para habilitar o suporte a links simbolicos, e agora habilite o Rewrite assim:
a2enmod rewrite && sudo invoke-rc.d apache2 restart
Pronto se os passos acima derem certo, esta feito.
O Arquivo .htaccess
Para começar sim, esse é um arquivo somente com extesão, segundo, é nele que vamos dizer que queremos o Rewrite habilidato e onde iremos escrever as nossas regrar para “reescrita” das urls.
Nosso .htaccess ficaria como isto:
RewriteEngine on
RewriteBase /blog
RewriteRule posts/([a-zA-Z\\s]+)\/([0-9]*)/(.*)$ post.php?cat=$1&id=$2&nome=$3
Para nosso exemplo iriamos ter algo assim no .htaccess, explicando melhor o que acontece ai:
Linha 1: “ligamos” o Modo Rewrite. Linha 2: Dizemos que a base te todo o conteudo será em /blog
Na linha 3 é onde reside a nossa lógica de reescrita da url, como você pode notar temos uma expressão regular ai, vamos entender um pouco o que ela faz:
posts/ quer dizer que tudo que começar com posts/ irá usar esse nossa expressão, então seguimos com ela e temos ([a-zA-Z\\s]+) aqui dizemos que queremos somente letras e espaços em branco, ([0-9]*) aqui somente numeros, e por fim qualquer coisa.
Essa explicação foi muito superficial e é provavel que você não tenha entendido caso nunca viu uma expressao regular na frente, para isso ao final desse post irá ter alguns links contendo alguns sobre ER.
então dizemos que qualquer ocorrencia de um “string” contendo algo que case com a expressao deve ser “lido” como post.php?cat=$1&id=$2&nome=$3.
Ops que diabos são esses $1, $1, $1, o que esta entre os parenteses está sendo “guardado” nessas variaveis, o que nos leva a conclusão que SIM agora podemos acessar essas váriaveis atráves do método $_GET.
Bom basicamente é isso, abaixo segue um exemplo do uso da URL como descrito acima, é apenas uma demostração caso você queira testar ai, os códigos abaixo consistem em um exemplo onde são apresentados dois links como se fosse um “blog”, esta usando Mysql para puxar os dados de exemplo, creio que com isso irá dar para ter um idéia e para você ir fazendo uns testes em cima dele, então lá vai:
list.php
1 <?
2 require “connet_db.php“;
3 echo “<h1>List Posts</h1>“;
4 $posts = mysql_query(“SELECT * FROM posts“);
5
6 $linhas = mysql_num_rows($posts);
7
8 if (!$posts) {
9 echo ‘Não foi possivel executar a consulta: ‘ . mysql_error();
10 exit;
11 }
12 for($i=0; $i < $linhas; $i++){
13
14 $dado = mysql_fetch_row($posts);
15 echo “<p><a href=\”/blog/posts/$dado[2]/$dado[0]/$dado[1] \”> $dado[1] </a></p>“;
16
17 }
18
19?>
post.php
1 <?
2 require “connet_db.php“;
3
4 $request = $_SERVER['REDIRECT_URL'];
5
6 echo “Category = “, $_GET['cat'];
7 echo “<br>“;
8 echo “ID = “, $_GET['id'];
9 echo “<br>“;
10
11 $cat = $_GET['cat'];
12 $id = $_GET['id'];
13 $nome = $_GET['nome'];
14
15 $consulta = mysql_query(“SELECT * FROM posts WHERE category=’$cat‘ and id=’$id‘ “);
16
17
18 $linhas = mysql_num_rows($consulta);
19
20 if (!$consulta) {
21 echo ‘Não foi possivel executar a consulta: ‘ . mysql_error();
22 exit;
23 }
24 for($i=0; $i < $linhas; $i++){
25 $dado = mysql_fetch_row($consulta);
26 echo “<p><b>Title:</b>“, $dado[1], “</p>“;
27 echo “<p><b>Catgory:</b>“, $dado[2], “</p>“;
28 echo “<p><b>Body:</b>“, $dado[3], “</p>“;
29 }
30
31 echo “Vejamos temos um array da URL, você pode usar ele para cirar seus links, ou se preferir use o GET como feito acima“;
32 $parts = explode(‘/‘, $request);
33 array_shift($parts); // deleta o primeiro elemento do array pois é sempre vazio
34
35 echo“<pre>“;
36 print_r($parts);
37 echo “</pre>“;
38
39
40 ?>
Tá ai o exemplo, obviamente falta a arquivo de conexao com o banco de dados, abaixo tem um link para baixar todos os arquivos do exemplo. Bom é isso espero que venha a ser útil para alguem. Até a próximo.
OBS : Perdoem a falta de identação do código mas o wordpress que faz isso(as vezes)
Blog at WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.