santomoly
Así que cometí por error mi secrets.yml en confirmaciones anteriores (¡ay!) y quiero limpiar mi historial de confirmaciones de git. Parece que la forma más sencilla en ayunas es usar BFG. Descargué el archivo jar e instalé Java, se requiere, y creé un espejo de mi repositorio, pero cuando ejecuto el comando según los documentos:
java -jar bfg.jar --delete-files secrets.yml my-repo.git
me sale el error Unable to access jarfile bfg.jar
Los documentos son bastante bonitos, pero no especifican si hay algo que debería haber hecho para instalar esto o ponerlo en funcionamiento, o vincularlo a mi repositorio espejo, y estoy bastante confundido. Vi un tutorial de youtube que dice que debo crear un enlace simbólico usando un comando como;
ln -s ~/bfg-1.11.6.jar /usr/local/bin/bfg
para ejecutar el bfg, excepto que no estoy seguro de a qué se refiere la segunda parte de ese comando ( /usr/local/bin/bfg
) o hacia dónde debería estar apuntando en mi caso, ya que eso no funciona para mí tal como está. Tengo el archivo jar guardado en mi directorio raíz de usuario. ¿Necesito moverlo? ¿Cómo ejecuto BFG en mi repositorio espejo? ¿Debería hacerlo? adentro ¿El directorio de mi aplicación espejo cuando la ejecuto? ¿O la ejecuto desde fuera de la aplicación?
VonC
2015: De la documentacióndebería ser:
java -jar bfg.jar <options> yourrepo
Pruebe y use la ruta completa del jar si tiene un error como “Unable to access jarfile bfg.jar
“: /home/user/path/to/bfg.jar
.
Si los jars están configurados para ejecutarse con Javaentonces /usr/local/bin/bfg
sería la ruta del enlace simbólico que hace referencia al contenedor bfg correcto.
La alternativa se describe en “Eliminar datos confidenciales“
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch Rakefile' \
--prune-empty --tag-name-filter cat -- --all
O (actualización de noviembre de 2017), como comentó JeremyDouglass,
Si usted descargar lo último (por ejemplo, de 1.12.16el
bfg-1.12.6.jar
) y solo desea usar comandos estándar en un directorio de ensayo local únicamente (sin ruta, sin enlace simbólico), entonces simplemente puede cambiar el nombre del contenedor:
mv bfg-1.12.16.jar bfg.jar
java -jar bfg.jar --delete-files bad.txt repo.git
2019-2020: más recientemente, ahora usaría Debería usar git filter-repo
(que mencioné aquí).
instalarlo primero. (python3 -m pip install --user git-filter-repo
)
Luego, usando un filtro basado en ruta:
git filter-repo --path secrets.yml --invert-paths HEAD
HEAD significa que cambiará solo las confirmaciones de rama actuales.
Elimina HEAD y revisará todas tus confirmaciones en todas tus ramas.
-
Gracias VonC, finalmente lo abandoné y lo hice con
git filter-branch
según los documentos de git, debería haber probado la ruta completa, y hubiera sido genial si hubieran cubierto un poco los errores en los documentos, pero así es la vida. Hice el trabajo de todos modos, ¡pero probaré la ruta completa la próxima vez que intente usar bfg! gracias de nuevo 😉– Holy Moly
7 sep 2015 a las 18:46
-
@HolyMoly Me alegro de que hayas hecho que funcione. He editado la respuesta para incluir el
git filter-branch
alternativa.– VoC
7 sep 2015 a las 20:08
-
Si descarga la última versión (p. ej.
bfg-1.11.6.jar
) y solo desea usar comandos estándar en un directorio de ensayo local únicamente (sin ruta, sin enlace simbólico), entonces simplemente puede cambiar el nombre del contenedor:mv bfg-1.11.6.jar bfg.jar
entoncesjava -jar bfg.jar --delete-files bad.txt repo.git
.– Jeremy Douglas
1 de noviembre de 2017 a las 8:13
-
@JeremyDouglas Gracias. He incluido tu comentario en la respuesta para mayor visibilidad. Y usé 1.12.16 como último;)
– VoC
1 de noviembre de 2017 a las 8:22
-
@Leonif Luego, vaya a la carpeta donde lo descargó, y el comando mv funcionará.
– VoC
13 de febrero de 2020 a las 9:28
Pradeep Kachhawaha
Una vez que haya instalado BFG (por ejemplo, usando brew install BFG
), puede llamar al comando BFG en la terminal.
Aquí está la ayuda de la línea de comandos para BFG:
bfg
bfg 1.13.0
Usage: bfg [options] [<repo>]
-b, --strip-blobs-bigger-than <size>
strip blobs bigger than X (eg '128K', '1M', etc)
-B, --strip-biggest-blobs NUM
strip the top NUM biggest blobs
-bi, --strip-blobs-with-ids <blob-ids-file>
strip blobs with the specified Git object ids
-D, --delete-files <glob>
delete files with the specified names (eg '*.class', '*.{txt,log}' - matches on file name, not path within repo)
--delete-folders <glob> delete folders with the specified names (eg '.svn', '*-tmp' - matches on folder name, not path within repo)
--convert-to-git-lfs <value>
extract files with the specified names (eg '*.zip' or '*.mp4') into Git LFS
-rt, --replace-text <expressions-file>
filter content of files, replacing matched text. Match expressions should be listed in the file, one expression per line - by default, each expression is treated as a literal, but 'regex:' & 'glob:' prefixes are supported, with '==>' to specify a replacement string other than the default of '***REMOVED***'.
-fi, --filter-content-including <glob>
do file-content filtering on files that match the specified expression (eg '*.{txt,properties}')
-fe, --filter-content-excluding <glob>
don't do file-content filtering on files that match the specified expression (eg '*.{xml,pdf}')
-fs, --filter-content-size-threshold <size>
only do file-content filtering on files smaller than <size> (default is 1048576 bytes)
-p, --protect-blobs-from <refs>
protect blobs that appear in the most recent versions of the specified refs (default is 'HEAD')
--no-blob-protection allow the BFG to modify even your *latest* commit. Not recommended: you should have already ensured your latest commit is clean.
--private treat this repo-rewrite as removing private data (for example: omit old commit ids from commit messages)
--massive-non-file-objects-sized-up-to <size>
increase memory usage to handle over-size Commits, Tags, and Trees that are up to X in size (eg '10M')
<repo> file path for Git repository to clean
Para mí, el jar bfg tenía una versión en su nombre (bfg-1.14.0.jar). Cambié el nombre del jar a bfg.jar y procedí con el comando y funcionó. Lo sé, tonto error. ¡Pero hey!
dar la ruta completa al archivo .jar es la forma segura de hacerlo.
– señor
17 de mayo de 2022 a las 9:19