Que quieres sacar un parche de un commit y llevartelo a otro sitio, facil:
git format-patch -1 <sha> > file.patch
git am -3 < file.patch
Desarrollo y testing, servidores y Debian, seguridad
¡ Que trabaje el CRON !
Que quieres sacar un parche de un commit y llevartelo a otro sitio, facil:
git format-patch -1 <sha> > file.patch
git am -3 < file.patch
Unlike the other systems, Git has something called the «staging area» or «index». This is an intermediate area where commits can be formatted and reviewed before completing the commit.
One thing that sets Git apart from other tools is that it’s possible to quickly stage some of your files and commit them without committing all of the other modified files in your working directory or having to list them on the command line during the commit.
This allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as needed.
## agregar ficheros al staging
git add file
## agregar ficheros al staging
git commit -m"title" -m"description"
## agregar cambios al ultimo commit
git commit --amend -m"title" -m"description"
## deshacer commit, hash es el hash del commit al que quieres volver
git reset hash
# origins
# agregando un origen remoto, con convención ‘origin’ y ‘upstream’
git remote add origin http://rutaproject/project
# ver configuracion remota del origin
git remote show origin
#pull tirar, se trae cambios, push empuja sube cambios
#antes de hacer un push, hacer un pull
#para actualizar el contenido de mi rama
git pull origin master
o
git merge origin master
# con rebase intenta reordenar los commits de forma que no se pierda la historia
git merge --rebase origin master
#ahora ya podemos intercambiar codigo con otras ramas, voy a subir mi rama feature/new-feature
git push origin feature/new-feature
# stash, el cajón
# guardamos lo que hay en el staging pendiente de commitear en un cajón
git stats
# guardar notas para un stash
git stats save "explanation about this stash"
# ver los stash que hay
git stats list
# ver quét tiene un stash, ver stash #3
git stats show stash@{3}
## por defecto el reset, es –soft, te deja los cambios realizados en working directoy
git reset hash
## El modo –hard, elimia todo
git reset --hard hash
## deshacer el ultimo cambio, genera un commit nuevo con nombre «Revert: nombre del commit anterior», una nueva entrada en la historia, aplicando los cambios necesarios para dejar el contenido tal y como estaba antes
git revert
## si no queremos que se genere un commit, podemos usar –no-commit y nos dejará los cambios en el staging
git revert --no-commit
## este commando requiere finarlo, y generará un nuevo commit
git revert --continue
## también se puede hace referencia a HEAD, y HEAD~1, HEAD~2 para indicar los pasos previos a HEAD
git reset HEAD
git reset HEAD~1
# Recuerda que si haces un reset HEAD, el HEAD se moverá al siguiente elemento, y los desplazamientos de ~1 o ~2 serán en base a ese estado
git reset HEAD~2
# comparar ficheros de diferentes ramas, compara somebranch con la rama actual
git diff somebranch path/to/your/file
# configurar herramienta para hacer diffing
git config diff.tool xxdiff
## rama actual
git branch
## crear rama desde la rama actual, todo tiene un origen
git checkout -b'feature/nombre'
## borrar rama
git -D branch
## renombrar rama
git -m branch newbranchname
# fusionar ramas
# debes posicionarte en la rama que va a recibir los cambios, con merge te traes los cambios a la rama actual
git merge feature/somethiing-new
# mezcla de ramas puede ser con fast forward que lo que hace es directamente cambiar el puntero HEAD a la rama que nos estamos trayendo, siempre que sea posible
«The –no-ff flag prevents git merge from executing a «fast-forward» if it detects that your current HEAD is an ancestor of the commit you’re trying to merge. A fast-forward is when, instead of constructing a merge commit, git just moves your branch pointer to point at the incoming commit. This commonly occurs when doing a git pull without any local changes.
However, occasionally you want to prevent this behavior from happening, typically because you want to maintain a specific branch topology (e.g. you’re merging in a topic branch and you want to ensure it looks that way when reading history). In order to do that, you can pass the –no-ff flag and git merge will always construct a merge instead of fast-forwarding.»
http://stackoverflow.com/questions/9069061/what-is-the-difference-between-git-merge-and-git-merge-no-ff/9069127#9069127
# etiquetas, tag
# nombra a un commit con un nombre para humanos
# para etiquetado ver http://semver.org/
# tagea el ultimo commit como v.1.0.1
git tag v1.0.1
# tagea un commit concreto
git tag v1.0.2 433fc3
# listar todos los tags
git tag
# eliminar tag
git tag -d tagname
## etiquetas anotadas
# etiquetas con mayor contenido de información agregado
# exigue que le indiques texto como si fuera un commit
git tag -a tagname
# puedes ver info del tag con git show, descripción y diffing
git show tagname
# otras ramas
## ver un fichero de la rama somebranch
git show somebranch path/to/your/file
# traerte un fichero de otra rama
git checkout somebranch path/to/your/file
# buscar a que branch pertenece un hash
git branch --contains ce1637f
# tambien se puede hacer con el reflog
git reflog show --all | grep ce1637f
# historial de cambios, muestra la historia verdadera de lo que ha pasado
git reflog
# ver las referencias de ramas remotas, en este caso busco un tag en concreto
git ls-remote origin --tags v1.5.0
a56956fc089c84482f0f457d1fa299142f8d6e42 refs/heads/release/v1.5.0
# ver ramas remotas con informacion extendida
git remote show origin
# http://stackoverflow.com/a/9074343
# git lg para mostrar un arbol con color de ramas y etiquetas
# ~./gitconfig
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
[core]
excludesfile = /home/jorge/.gitignore_global
Prompt para bash para mostrar el branch actual
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ '
#git find file alias script
git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'
#git grep through branches with no pagger
for branch in `git for-each-ref –format=»%(refname)» refs/heads`; do echo «[+] $branch :» ; GIT_PAGER=cat git grep ‘OfferType’ $branch; done
git hooks
https://github.com/brigade/overcommit#installation
# git avanzada
http://learngitbranching.js.org/?demo
H4ckademy es una experiencia de nueve semanas en las que se mejoran las habilidades como desarrollador. Es una experiencia autoguiada, esto quiere decir que tú mismo te marcas tus objetivos, tus metas, el ritmo y el camino, siempre acompañado de Israel Gutierrez @gootyfer que se encarga de guiar, orientar y proveer del conocimiento que se demanda, y Monitca Quitana @moquintana en la parte de softkills.
Para mí ha supuesto un antes y un después en cuanto a mi visión como desarrollador, mi carrera profesional y mi vida personal. He tenido la suerte de compartir dos meses con gente maravillosa ( #creepy_coconuts ) y conocer a gente increible, tanto mentores ( Sergio, Enrique, Alex, Rubén, Javi…) como gente de otras ediciones, gente del Campus Madrid, meetups, etc…
Muchas gracias a Israel y a Mónica por arriesgarse y dar vida a h4ckademy, nuevos caminos que son el futuro.
Aquí os dejo un pequeño diario de lo que han sido mis nueve semanas, algunas cosas se me han pasado por alto y otras son notas personales sólo comprensibles para mí, pero creo que da idea, de qué es lo que han sido estos dos meses.
fiesta
for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo $branch :; git ls-tree -r --name-only $branch | grep 'w' donesheb
2017 git rebase -i 20ad008 2018 git status 2020 vim server_app/autoconstruccion/web/views.py 2021 ./test.sh 2022 git status 2023 git add server_app/autoconstruccion/web/views.py 2024 git status 2025 git commit --amend 2026 git rebase --continue 2027 git status 2028 git push origin calendar_popup --force
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash nvm install 4.4.2 nvm use 4.2.2
{ [MongoError: too much data for sort() with no index. add an index or specify a smaller limit]
use debate db.images.createIndex( { date: 1 } )
db.repairDatabase()
db.images.remove()
# listado de ficheros de un branch git ls-tree -r $branch_name
# Si hay conflictos en tu pull request # This branch has conflicts that must be resolved git pull --rebase upstream master #hacer un git add de las modificciones, sin commit git rebase --continue git push origin send_mail --force
Este mensaje es para tí desarrollador de php y más concretamente usuario de opauth. Revisa tu software si estás usando opauth-facebook-strategy, por que puede que haya dejado de funcionar o que no funcione en tu próxima puesta en producción.
Para el que no conozca opauth es una capa de abstracción para la autenticación basada en oauth, de forma que se puede usar de una forma muy cómoda entre distintos proveedores del servicio de autenticación, entre ellos los más usados: Facebook, Google, Twitter y Linkedin.
En CakePHP hay un Plugin muy práctico que facilita esta funcionalidad https://github.com/uzyn/cakephp-opauth y las ‘strategies’ que complementan su uso, que son todos y cada uno de los proveedores soportados
En mi caso comencé a usar opauth-facebook para autenticar al usuario en mi aplicación y precargar algunos datos de su cuenta, como el nombre, apellidos y email. Bastante cómodo de implementar por cierto.
El problema ha sido cuando al subir el desarrollo a preproducción, los datos del usuario no eran retornados por la API Facebook ( https://graph.facebook.com/me ) . El usuario se autenticaba correctamente , pero retornaba id y name.
Después de muchas horas, verificando parámetros entre desarrollo y preproducción me he percatado, de que la app de desarrollo había sido creada con la versión 2.2 de la API y la de prepoducción con la 2.4. El cambio no es para nada trivial, y es que por defecto en la versión 2.4 hay que especificar los campos que queremos retornar en cada petición. Aquí aparece el fragmento de CHANGELOG
https://developers.facebook.com/docs/apps/changelog#v2_4_changes
Declarative Fields
To try to improve performance on mobile networks, Nodes and Edges in v2.4 requires that you explicitly request the field(s) you need for your GET requests. For example, GET /v2.4/me/feed no longer includes likes and comments by default, but GET /v2.4/me/feed?fields=comments,likes will return the data. For more details see the docs on how to request specific fields.
Vale, una vez verificado que este era el problema, he modificado el modulo opauth-facebook para que permita vía configuración indicar los campos que queremos retornar.
El probema es que la implementación no permite indicar el número de versión de API a usar, con lo que utiliza la última. Como la utilidad real del módulo es la autenticación y captura de información básica me he limitado a hacer unos cambios mínimos pero funcionales. Podéis echar un vistazo a los cambios aquí https://github.com/jsenin/facebook
Para los que desarrollamos con cakephp alugna vez hemos tenido la necesidad de volcar todas las consultas SQL que se ejecutan en cada petición de nuestra aplicación. Una manera rápida y efectiva de volcar y poder trazar todas las queries es editar el fichero ‘/lib/Cake/Model/Datasource/DboSource.php’ y localizar la function execute() que es la función por la que pasan todas la llamadas SQL.
La herencia de objetos que incluye DboSource, permite llamar al logger de una manera muy sencilla:
[php]
$this->log( $query );
[/php]
De forma que la función quedará así:
[php]
/**
* Queries the database with given SQL statement, and obtains some metadata about the result
* (rows affected, timing, any errors, number of rows in resultset). The query is also logged.
* If Configure::read(‘debug’) is set, the log is shown all the time, else it is only shown on errors.
*
* ### Options
*
* – log – Whether or not the query should be logged to the memory log.
*
* @param string $sql SQL statement
* @param array $options The options for executing the query.
* @param array $params values to be bound to the query.
* @return mixed Resource or object representing the result set, or false on failure
*/
public function execute($sql, $options = array(), $params = array()) {
$options += array(‘log’ => $this->fullDebug);
$this->log( $sql );
$t = microtime(true);
$this->_result = $this->_execute($sql, $params);
if ($options[‘log’]) {
$this->took = round((microtime(true) – $t) * 1000, 0);
$this->numRows = $this->affected = $this->lastAffected();
$this->logQuery($sql, $params);
}
return $this->_result;
}
[/php]
Tengo que recordar que estamos modificando directamente el core de cakephp y que no es la manera adecuada, pero para un apuro es muy rápido y eficaz y claro está que en producción esto no lo podemos poner 😀
Si fuera necesario hacer un override aquí tenemos la documentación para llevarlo a cabo
http://book.cakephp.org/2.0/en/core-utility-libraries/app.html#overriding-classes-in-cakephp
UPDATE:
Si estás tratando de tracear la query final y estás usando ‘prepared staments‘, olvidate. Este tipo de consultas se pasan directamente al motor sql y las procesa automáticamente, con lo que te quedas igual.
Para loggear las consultas en mysql échale un vistazo a la documentación de MySQL
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
Este es otro pequeño ejemplo de esas cosas que vas dejando por que nunca tienes y sabes que te hacen falta. Ayer le dedicé tiempo y ya puedo decir que sí es posible convertir los snippets de TextMate a Gedit o Pluma para Mate-desktop.
Nicolas Alpi ( https://github.com/spyou ) desarolló hace tiempo un pequeño script en ruby que extrae los ficheros de snippets de Textmate para Gedit. Es un script muy muy sencillo en ruby en el cuál he corregido un pequeño detalle y le he agregado la posibilidad de indicar el directorio donde están los snippets. Una vez que ejecutas el script tmsnippets2gedit.rb se genera un fichero result.xml con la conversión. Este fichero deberemos copiarlo a la ruta de donde estén los demas ficheros de Gedit o Pluma con el nombre de la extensión a la que se aplicarán. Además hay que cambiar la cadena ‘[LANGUAGE]’ por el nombre de la extensión.
En mi caso lo quiero usar para importar los ficheros publicados en el repositorio oficial de phpcake Textmate bundle
Bueno… alguno se preguntará ¿ qué es un snippet ?. Los editores de texto como textmate, sublime, gedit o mi querido pluma tienen esta pequeña funcionalidad llamada snippets ( se puede traducir como recortes o fragmentos ) que lo que hacen es escribir un bloque de texto usando un pequeño ‘trigger‘ o disparador y presionando la tecla TAB.
Como la tecnología tiene que ayudar a mejorar tu vida, en resumen, lo que hace un snippet, es permitir que curremos más rápido, escribiendo un bloque de texto presionando un par de caracteres y el tab. Por ejemplo si quiero agregar en una vista un texto internacionalizado en PHPCake o Wordress tendré que escribir algo como esto :
[shell]<?php echo __(‘Translate this’) ?>
[/shell]
La cantidad de veces que hay que escribir el tag de php es odiosa y terriblemente aburrida, de forma que si uso un snippet puede asignar ‘echo’ + ‘tab’ y escribirá: <?php echo __(‘Translate this’) ?>
La configuración sería como en la imagen adjunta :
Ahora que ya tenemos todas la piezas, ¿como usar los snippets de cakephp en gedit/pluma ? Aquí tenéis un fragmento de los que me gustan a mí de copiar y pegar y listo:
[shell]Example to convert cakephp textame to gedit/pluma snippets
git clone https://github.com/jsenin/tmsnippets2gedit
sudo gem install ruby ruby-nokogiri
git clone https://github.com/cakephp/cakephp-tmbundle
cd cakephp-tmbundle
ruby ../tmsnippets2gedit.rb
sed -i ‘s/\[LANGUAGE\]/php/g’ result.xml
sudo cp result.xml /usr/share/pluma/plugins/snippets/php.xml
or
sudo cp result.xml ~/.config/pluma/snippets/php.xml[/shell]
Si trabajamos con gedit o pluma y con CakePHP nos interesa que los ficheros .ctp ( cake template ) se muestren con el sombreado ‘highligth’ como php y html de forma que sea más fácil trabajar con el contenido.
Por defecto este tipo de extensiones no son reconocidas por las instalaciones Debian, así que nos toca agregarlas. Para ello y basándome en este enlace he creado una pequeña modificación para que los ficheros .ctp se muestren coloreados
[shell]sudo sed -i ‘s@<glob pattern=»\*.phps»/>@<glob pattern=»*.phps»/>\n\t\t<glob pattern=»*.ctp»/>@g’ /usr/share/mime/packages/freedesktop.org.xml
sudo update-mime-database /usr/share/mime[/shell]
Estas son las herramientas que uso para desarrollo web, al final no hay un IDE que lo provea todo, si no que varias herramientas juntas y scripts personalizados complementan las herramientas necesarias.
Plugins para Gedit / Pluma
Plugins para firefox:
El cliente de PHP ( php-cli ) incorpora la capacidad de validar la sintaxis de código php así, para depurar errores en php usaremos «php -l Syntax check only (lint)» de forma :
[shell]
php -l test.php
No syntax errors detected in test.php
[/shell]
En caso de haber errores nos indicará el error y la linea.
También podemos usar code_sniffer que no sólo nos validará el código si no que además nos indica la calidad del código. Code sniffer soporta múltiples reglas de validación y niveles de mensaje para validar nuestro código, tanto en código como en estilo. Al ser una herramienta muy amplia le dedicaré un post específico.
Para validar código con php code sniffer :
[shell]
phpcs test.php
[/shell]
Tenemos tres alternativas para tener en nuestro entorno un validador de CSS
En debian existe un paquete que se llama libcroco-tools que contiene un csslint pero sólo para version css 2.0
[shell]libcroco-tools – Cascading Style Sheet (CSS) parsing and manipulation toolkit – utils[/shell]
Para instalarlo:
[shell]sudo apt-get isntall libcroco-tools[/shell]
Para usarlo
[shell]csslint-0.6 demo.css[/shell]
Otra herramienta es csstidy que nos permite es optimizar el contenido de css, de forma que elimina y avisa de propiedades no válidas o transforma valores para que sean más óptimos. No es extrictamente un validador y soporta sólo CSS 2.1
para instalarlo
[shell]sudo apt-get install csstidy>[/shell]
para usarlos
[shell]csstidy test.css output.css[/shell]
El paquete codesniffer también contiene un css lint
Para instalarlo
[shell]sudo apt-get install php-codesniffer[/shell]
para usarlo:
[shell]phpcs demo.css[/shell]
http://csslint.net/
Es el más usado y el que ya viene paquetizado para sublime editor
Además está disponible para usarlo online.
[shell]# instalar node
# https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
sudo su -c ‘echo «deb http://ftp.us.debian.org/debian wheezy-backports main» >> /etc/apt/sources.list.d’/nodejs.list
sudo apt-get update
sudo apt-get install nodejs-legacy
# instalar nm
curl https://www.npmjs.org/install.sh | sudo sh
# instalar csslint
sudo npm install -g csslint[/shell]
para usarlo
[shell]csslint demo.css[/shell]