blob: ed3b4db5cc7b0217878ed4fdefe0c0df176f0cc0 [file] [log] [blame]
<html devsite><head>
<title>Visão geral</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.yaml"/>
</head>
<body>
<!--
Copyright 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>
Trabalhar com código Android requer o uso do <strong>Git</strong> (um sistema de controle de versão de código aberto) e do <strong>Repo</strong> (uma ferramenta de gestão de repositório criada pelo Google e executada sobre o Git).
</p>
<h2 id="git">Git</h2>
<p>
O Git foi projetado para lidar com grandes projetos distribuídos em vários repositórios. O Android usa o Git para operações locais, como branches, confirmações, diferenças e edições locais. Um dos desafios da configuração do projeto Android foi descobrir como oferecer o melhor apoio à comunidade externa, desde a comunidade de amadores até grandes OEMs que fabricam dispositivos de consumo para o mercado de massa. Queríamos componentes interessantes que tivessem uma vida própria fora do Android e que fossem substituíveis. Primeiro, escolhemos um sistema de controle de revisão distribuído e, em seguida, nós o limitamos ao Git.
</p>
<p>
Para ver mais detalhes sobre o Git, consulte a <a href="https://git-scm.com/documentation" class="external">documentação do Git</a> (em inglês).
</p>
<h2 id="repo">Repo</h2>
<p>
O Repo unifica os repositórios do Git quando necessário, realiza uploads para o <a href="https://android-review.googlesource.com/">sistema de controle de revisão Gerrit</a> e automatiza partes do fluxo de trabalho de desenvolvimento do Android. O objetivo não é que o Repo substitua Git, mas apenas facilite o trabalho com o Git no contexto do Android. O comando Repo é um script Python executável que pode ser colocado em qualquer lugar do seu caminho. Ao trabalhar com arquivos de origem do Android, você usa o Repo para operações em toda a rede. Por exemplo, com um único comando Repo, é possível fazer o download de arquivos de vários repositórios no seu diretório de trabalho local.
</p>
<p>
Na maioria das situações, é possível usar o Git em vez do Repo ou combinar os comandos Repo e Git para formar comandos complexos. No entanto, usar o Repo para operações básicas em toda a rede facilitará muito seu trabalho. Para ver mais detalhes sobre o Repo, consulte o artigo <a href="/setup/develop/repo">Referência do comando Repo</a>.
</p>
<h2 id="other-tools">Outras ferramentas</h2>
<p>
Uma das outras ferramentas usadas é o <a href="https://gerrit-review.googlesource.com/Documentation/" class="external">Gerrit</a>, um sistema de análise de código baseado na Web para projetos que usam o Git. O Gerrit incentiva o uso mais centralizado do Git, permitindo que todos os usuários autorizados enviem alterações, que são automaticamente mescladas se forem aprovadas na análise do código. Além disso, o Gerrit facilita a análise, exibindo as alterações lado a lado no navegador e permitindo comentários in-line.
</p>
<p>
Por fim, o <a href="http://developer.android.com/tools/studio/index.html" class="external">Android Studio</a> é o ambiente de desenvolvimento integrado oficial para o desenvolvimento de aplicativos Android.
</p>
<h2 id="workflow">Fluxo de trabalho</h2>
<p>
O desenvolvimento do Android envolve o seguinte fluxo de trabalho básico:
</p>
<ol>
<li>Iniciar um novo branch de tópico usando <code>repo start</code>.
</li>
<li>Editar os arquivos.
</li>
<li>Preparar as alterações usando <code>git add</code>.
</li>
<li>Confirmar as alterações usando <code>git commit</code>.
</li>
<li>Fazer upload das alterações para o servidor de revisão usando <code>repo upload</code>.
</li>
</ol>
<h2 id="common-tasks">Tarefas comuns</h2>
<p>
Trabalhar com o Git e o Repo nos repositórios de código do Android envolve a execução das seguintes tarefas comuns:
</p>
<table>
<tbody><tr>
<th>Comando</th>
<th>Descrição</th>
</tr>
<tr>
<td><code>repo init</code></td>
<td>Inicializa um novo cliente.</td>
</tr>
<tr>
<td><code>repo sync</code></td>
<td>Sincroniza o cliente nos repositórios.</td>
</tr>
<tr>
<td><code>repo start</code></td>
<td>Inicia um novo branch.</td>
</tr>
<tr>
<td><code>repo status</code></td>
<td>Mostra o status do branch atual.</td>
</tr>
<tr>
<td><code>repo upload</code></td>
<td>Faz upload das alterações para o servidor de revisão.</td>
</tr>
<tr>
<td><code>git add</code></td>
<td>Prepara os arquivos.</td>
</tr>
<tr>
<td><code>git commit</code></td>
<td>Confirma os arquivos preparados.</td>
</tr>
<tr>
<td><code>git branch</code></td>
<td>Mostra os branches atuais.</td>
</tr>
<tr>
<td><code>git branch [branch]</code></td>
<td>Cria um novo branch de tópico.</td>
</tr>
<tr>
<td><code>git checkout [branch]</code></td>
<td>Muda o HEAD para o branch especificado.</td>
</tr>
<tr>
<td><code>git merge [branch]</code></td>
<td>Mescla o [branch] com o branch atual.</td>
</tr>
<tr>
<td><code>git diff</code></td>
<td>Mostra a diferença entre alterações não preparadas.</td>
</tr>
<tr>
<td><code>git diff --cached</code></td>
<td>Mostra a diferença entre alterações preparadas.</td>
</tr>
<tr>
<td><code>git log</code></td>
<td>Mostra o histórico do branch atual.</td>
</tr>
<tr>
<td><code>git log m/[codeline]..</code></td>
<td>Mostra confirmações que não foram enviadas.</td>
</tr>
</tbody></table>
<p>
Para ver informações sobre o uso do Repo para fazer o download da origem, consulte <a href="/setup/build/downloading">Como fazer o download da origem</a> e <a href="/setup/develop/repo">Referência do comando Repo</a>.
</p>
<h3 id="synchronizing-clients">Como sincronizar clientes</h3>
<p>
Para sincronizar os arquivos para todos os projetos disponíveis:
</p>
<pre class="devsite-terminal devsite-click-to-copy">repo sync</pre>
<p>
Para sincronizar os arquivos para os projetos selecionados:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
repo sync <var>PROJECT0 PROJECT1 ... PROJECTN</var>
</pre>
<h3 id="creating-topic-branches">Como criar branches de tópicos</h3>
<p>
Inicie um branch de tópico no seu ambiente de trabalho local sempre que começar uma alteração, como quando você começar a trabalhar em um bug ou em um novo recurso. Um branch de tópico <strong>não</strong> é uma cópia dos arquivos originais, mas sim um ponteiro para uma confirmação específica, o que torna a criação de branches locais e a alternância entre eles uma operação leve. Usando branches, é possível isolar um aspecto do seu trabalho dos outros. Para ver um artigo interessante sobre o uso de branches de tópicos, consulte <a href="http://www.kernel.org/pub/software/scm/git/docs/howto/separating-topic-branches.txt" class="external">Como separar branches de tópicos</a> (link em inglês).
</p>
<p>
Para iniciar um branch de tópico usando o Repo, navegue até o projeto e execute:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
repo start <var>BRANCH_NAME</var> .
</pre>
<p>
O ponto final (.) representa o projeto no diretório de trabalho atual.
</p>
<p>
Para verificar se o novo branch foi criado:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
repo status .
</pre>
<h3 id="using-topic-branches">Como usar branches de tópicos</h3>
<p>Para atribuir o branch a um projeto específico:</p>
<pre class="devsite-terminal devsite-click-to-copy">
repo start <var>BRANCH_NAME PROJECT_NAME</var>
</pre>
<p>Para ver uma lista de todos os projetos, consulte <a href="https://android.googlesource.com/" class="external">android.googlesource.com</a>.
Se você já navegou para o diretório do projeto, use um ponto apenas para representar o projeto atual.
</p>
<p>
Para mudar para outro branch no seu ambiente de trabalho local:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
git checkout <var>BRANCH_NAME</var>
</pre>
<p>
Para ver uma lista de branches existentes:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
git branch
</pre>
<p>ou</p>
<pre class="devsite-terminal devsite-click-to-copy">
repo branches
</pre>
<p>
Os dois comandos retornam a lista de branches existentes com o nome do branch atual precedido por um asterisco (*).
</p>
<aside class="note"><strong>Observação</strong>: um bug pode fazer com que <code>repo
sync</code> redefina o branch de tópico local. Se <code>git branch</code> mostrar * (sem branch) depois que você executar o <code>repo sync</code>, execute <code>git checkout</code> novamente.</aside>
<h3 id="staging-files">Como preparar arquivos</h3>
<p>
Por padrão, o Git percebe, mas não monitora, as alterações feitas em um projeto.
Para dizer ao Git para preservar suas alterações, você precisa marcar ou <em>preparar</em> essas mudanças para inclusão em uma confirmação.
</p>
<p>
Para preparar alterações:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
git add
</pre>
<p>
Esse comando aceita argumentos para arquivos ou diretórios dentro do diretório do projeto. Apesar do nome, <code>git add</code> não tem como única função adicionar arquivos ao repositório git, mas também preparar modificações e exclusões de arquivos.
</p>
<h3 id="viewing-client-status">Como ver o status do cliente</h3>
<p>
Para listar o estado dos arquivos:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
repo status
</pre>
<p>
Para ver as edições não confirmadas (edições locais que <strong>não</strong> estão marcadas para confirmação):
</p>
<pre class="devsite-terminal devsite-click-to-copy">
repo diff
</pre>
<p>
Para ver as edições confirmadas (as edições localizadas <strong>marcadas</strong> para confirmação), verifique se você está no diretório do projeto e, em seguida, execute <code>git
diff</code> com o argumento <code>cached</code>:
</p>
<pre class="devsite-click-to-copy">
<code class="devsite-terminal">cd <var>~/WORKING_DIRECTORY/PROJECT</var></code>
<code class="devsite-terminal">git diff --cached</code>
</pre>
<h3 id="committing-changes">Como confirmar alterações</h3>
<p>
Uma <em>confirmação</em> é a unidade básica do controle de revisão no Git e consiste em um instantâneo da estrutura de diretório e do conteúdo do arquivo para todo o projeto. Para criar uma confirmação no Git:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
git commit
</pre>
<p>
Quando for solicitada uma mensagem de confirmação, forneça uma mensagem breve, mas útil, para as alterações enviadas ao AOSP. Se você não adicionar uma mensagem de confirmação, ela será cancelada.
</p>
<h3 id="uploading-changes-to-gerrit">Como fazer upload das alterações para o Gerrit</h3>
<p>
Atualize para a revisão mais recente e, em seguida, faça upload da alteração:
</p>
<pre class="devsite-click-to-copy">
<code class="devsite-terminal">repo sync</code>
<code class="devsite-terminal">repo upload</code>
</pre>
<p>
Esse comando retorna uma lista das alterações que você confirmou e solicita que você selecione os branches que serão enviados para o servidor de revisão. Se houver apenas um branch, você verá uma solicitação <code>y/n</code> simples.
</p>
<h3 id="resolving-sync-conflicts">Como resolver conflitos de sincronização</h3>
<p>
Se o comando <code>repo sync</code> retornar conflitos de sincronização:
</p>
<ol>
<li>Veja os arquivos cuja mesclagem foi cancelada (código de status = U).</li>
<li>Edite as regiões de conflito conforme necessário.</li>
<li>Mude para o diretório do projeto relevante. Adicione e confirme os arquivos afetados e realoque as alterações:
<pre class="devsite-click-to-copy">
<code class="devsite-terminal">git add .</code>
<code class="devsite-terminal">git commit</code>
<code class="devsite-terminal">git rebase --continue</code>
</pre>
</li>
<li>Após a conclusão da realocação, inicie toda a sincronização novamente:
<pre class="devsite-terminal devsite-click-to-copy">
repo sync <var>PROJECT0 PROJECT1 ... PROJECTN</var>
</pre>
</li>
</ol>
<h3 id="cleaning-up-client-files">Como fazer a limpeza de clientes</h3>
<p>
Depois de mesclar as alterações no Gerrit, atualize seu diretório de trabalho local e use <code>repo prune</code> para remover com segurança os branches de tópico desatualizados:
</p>
<pre class="devsite-click-to-copy">
<code class="devsite-terminal">repo sync</code>
<code class="devsite-terminal">repo prune</code>
</pre>
<h3 id="deleting-clients">Como excluir clientes</h3>
<p>
Como todas as informações de estado são armazenadas no seu cliente, você só precisa excluir o diretório do seu sistema de arquivos:
</p>
<pre class="devsite-terminal devsite-click-to-copy">
rm -rf <var>WORKING_DIRECTORY</var>
</pre>
<p>
A exclusão de um cliente <em>exclui permanentemente</em> todas as alterações que você ainda não enviou para análise.
</p>
</body></html>