{"id":278,"date":"2026-05-31T16:23:59","date_gmt":"2026-05-31T23:23:59","guid":{"rendered":"https:\/\/www.mariatech.com.mx\/blog\/?p=278"},"modified":"2026-05-31T16:24:00","modified_gmt":"2026-05-31T23:24:00","slug":"como-cambiar-la-autenticacion-de-github-de-access-token-a-ssh-en-un-proyecto-laravel","status":"publish","type":"post","link":"https:\/\/www.mariatech.com.mx\/blog\/laravel-php\/como-cambiar-la-autenticacion-de-github-de-access-token-a-ssh-en-un-proyecto-laravel\/","title":{"rendered":"C\u00f3mo cambiar la autenticaci\u00f3n de GitHub de Access Token a SSH en un proyecto Laravel"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Cuando trabajamos con proyectos alojados en GitHub, es com\u00fan que al principio usemos una URL HTTPS con un <strong>Personal Access Token<\/strong> para clonar, descargar o actualizar el repositorio. Sin embargo, estos tokens pueden vencer, ser revocados o simplemente dejar de funcionar por cambios de seguridad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo veremos c\u00f3mo migrar la autenticaci\u00f3n de un proyecto desde HTTPS con token hacia SSH, c\u00f3mo validar que la conexi\u00f3n funcione correctamente y qu\u00e9 hacer cuando Git no permite cambiar de rama porque existen archivos locales modificados, como puede pasar con archivos de configuraci\u00f3n en Laravel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El problema: el token de acceso ya venci\u00f3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Supongamos que tenemos un proyecto Laravel en un servidor de pruebas o demo. Al intentar ejecutar comandos como <code>git fetch<\/code>, <code>git pull<\/code> o <code>git checkout<\/code>, GitHub responde con un error de autenticaci\u00f3n porque el token que se usaba anteriormente ya venci\u00f3.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En muchos casos, aunque ya hayamos creado una llave SSH en el servidor, Git seguir\u00e1 usando el token anterior si el repositorio todav\u00eda tiene configurada una URL remota con HTTPS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es decir, crear una llave SSH no cambia autom\u00e1ticamente la forma en que Git se conecta al repositorio. Tambi\u00e9n debemos actualizar la URL remota del proyecto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Revisar la URL remota actual<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Primero debemos entrar a la carpeta del proyecto y revisar qu\u00e9 URL remota est\u00e1 usando Git.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/ruta\/general\/del\/proyecto\n\ngit remote -v<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si la respuesta muestra una URL similar a esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>origin  https:\/\/github.com\/usuario\/repositorio.git (fetch)\norigin  https:\/\/github.com\/usuario\/repositorio.git (push)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">significa que el proyecto todav\u00eda est\u00e1 usando HTTPS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En algunos casos, incluso puede aparecer un token dentro de la URL, algo parecido a esto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>origin  https:\/\/TOKEN@github.com\/usuario\/repositorio.git<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ese es el escenario que debemos corregir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Cambiar la URL remota de HTTPS a SSH<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para que Git use la llave SSH, debemos cambiar la URL remota del repositorio usando el comando <code>git remote set-url<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git remote set-url origin git@github.com:usuario\/repositorio.git<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este comando cambia el origen del repositorio para que Git deje de usar HTTPS y empiece a usar SSH.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s podemos verificar nuevamente la configuraci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git remote -v<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La salida esperada ser\u00eda algo como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>origin  git@github.com:usuario\/repositorio.git (fetch)\norigin  git@github.com:usuario\/repositorio.git (push)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. Probar la conexi\u00f3n SSH con GitHub<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de intentar descargar ramas o actualizar el proyecto, conviene probar que la llave SSH realmente est\u00e9 funcionando.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -T git@github.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si la autenticaci\u00f3n es correcta, GitHub responder\u00e1 con un mensaje indicando que la conexi\u00f3n fue exitosa, aunque no permita acceso de shell. Esto es normal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una respuesta esperada puede ser similar a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hi usuario! You've successfully authenticated, but GitHub does not provide shell access.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con eso confirmamos que la autenticaci\u00f3n SSH ya est\u00e1 funcionando.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Descargar informaci\u00f3n actualizada del repositorio<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez configurada la URL SSH, podemos ejecutar:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">git fetch origin<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este comando descarga la informaci\u00f3n actualizada de las ramas remotas sin mezclar cambios todav\u00eda en la rama actual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Cambiar a una rama remota<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si necesitamos crear una rama local a partir de una rama remota, podemos usar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b nombre-rama origin\/nombre-rama<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, en proyectos reales puede aparecer un error indicando que un archivo local tiene cambios y que Git necesita sobrescribirlo para cambiar de rama.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un caso com\u00fan en Laravel puede ser un archivo como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>config\/app.php<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">6. \u00bfPor qu\u00e9 pasa este error?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Git protege los cambios locales para evitar que se pierdan accidentalmente. Si tenemos modificaciones en un archivo y la rama a la que queremos cambiar tambi\u00e9n modifica ese archivo, Git detiene el proceso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A veces se intenta usar el comando <code>assume-unchanged<\/code> para que Git ignore temporalmente un archivo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git update-index --assume-unchanged config\/app.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este comando puede ayudar en algunos escenarios locales, pero no es una soluci\u00f3n ideal para manejar archivos de configuraci\u00f3n modificados en servidores o ambientes de demo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, aunque un archivo est\u00e9 marcado como <code>assume-unchanged<\/code>, Git a\u00fan puede bloquear operaciones si necesita proteger cambios locales antes de cambiar de rama.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Revisar si un archivo est\u00e1 marcado como assume-unchanged<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos revisar el estado del archivo con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git ls-files -v config\/app.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si el archivo aparece con una letra min\u00fascula al inicio, significa que est\u00e1 marcado como <code>assume-unchanged<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Quitar assume-unchanged<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de resolver el conflicto, es recomendable quitar esa marca para que Git vuelva a tratar el archivo normalmente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git update-index --no-assume-unchanged config\/app.php<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">9. Opci\u00f3n segura: guardar temporalmente los cambios con stash<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si necesitamos conservar los cambios locales del archivo, podemos guardarlos temporalmente con <code>git stash<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git stash push -m \"Backup config app\" -- config\/app.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s ya podemos intentar cambiar de rama:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b nombre-rama origin\/nombre-rama<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y si necesitamos recuperar los cambios guardados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git stash pop<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si al recuperar los cambios aparecen conflictos, deber\u00e1n resolverse manualmente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Opci\u00f3n r\u00e1pida: descartar cambios locales<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si los cambios locales no son importantes, podemos descartarlos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git restore config\/app.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s intentamos nuevamente cambiar de rama:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b nombre-rama origin\/nombre-rama<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta opci\u00f3n debe usarse con cuidado, porque elimina los cambios locales del archivo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Mejor pr\u00e1ctica en Laravel: usar .env para configuraci\u00f3n por ambiente<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En Laravel, lo m\u00e1s recomendable es evitar modificar archivos como <code>config\/app.php<\/code> directamente en cada servidor. Si una configuraci\u00f3n cambia dependiendo del ambiente, lo ideal es manejarla desde el archivo <code>.env<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, en lugar de dejar un valor fijo dentro de <code>config\/app.php<\/code>, podemos leerlo desde una variable de entorno:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'custom_product' =&gt; env('APP_CUSTOM_PRODUCT', false),<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y en el archivo <code>.env<\/code> del servidor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>APP_CUSTOM_PRODUCT=true<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">De esta manera cada ambiente puede tener su propia configuraci\u00f3n sin modificar archivos versionados en Git.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">12. Flujo recomendado completo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un flujo seguro para este tipo de situaci\u00f3n ser\u00eda:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/ruta\/general\/del\/proyecto\n\ngit remote -v\n\ngit remote set-url origin git@github.com:usuario\/repositorio.git\n\ngit remote -v\n\nssh -T git@github.com\n\ngit fetch origin\n\ngit update-index --no-assume-unchanged config\/app.php\n\ngit stash push -m \"Backup config app\" -- config\/app.php\n\ngit checkout -b nombre-rama origin\/nombre-rama<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si despu\u00e9s necesitamos recuperar los cambios locales:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git stash pop<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando un proyecto deja de autenticarse con GitHub porque venci\u00f3 un access token, una buena soluci\u00f3n es migrar la conexi\u00f3n del repositorio a SSH. Para que esto funcione, no basta con crear la llave SSH: tambi\u00e9n debemos cambiar la URL remota del repositorio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, si Git bloquea un cambio de rama por archivos modificados, debemos decidir si queremos conservar esos cambios con <code>git stash<\/code> o descartarlos con <code>git restore<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En proyectos Laravel, la recomendaci\u00f3n m\u00e1s limpia es mantener los archivos de configuraci\u00f3n versionados sin modificaciones locales y mover los valores espec\u00edficos de cada ambiente al archivo <code>.env<\/code>. Esto evita conflictos, mejora el flujo de despliegue y reduce errores al trabajar con ramas en Git.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si necesitas ayuda para crear un proyecto de software en\u00a0<strong>Maria Tech\u00a0<\/strong>contamos con los expertos para apoyarte.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/wa.me\/523414305984\" target=\"_blank\" rel=\"noreferrer noopener\">(+52) 341-430-59-84<\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"mailto:info@mariatech.com.mx\" target=\"_blank\" rel=\"noreferrer noopener\">info@mariatech.com.mx<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo veremos c\u00f3mo migrar la autenticaci\u00f3n de un proyecto desde HTTPS con token hacia SSH, c\u00f3mo validar que la conexi\u00f3n funcione&#8230;<\/p>\n","protected":false},"author":1,"featured_media":279,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,41],"tags":[],"class_list":["post-278","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel-php","category-git"],"_links":{"self":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=278"}],"version-history":[{"count":0,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/278\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media\/279"}],"wp:attachment":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}